From 59e1c61989eb6ae5f1448fb67cfbb41a90562501 Mon Sep 17 00:00:00 2001 From: ratkosrb Date: Thu, 19 Sep 2024 15:59:24 +0300 Subject: [PATCH] Fix anticheat false positive on spline done. Closes https://github.com/vmangos/core/issues/2700 --- .../MovementAnticheat/MovementAnticheat.cpp | 32 ++++++++++++------- src/game/Handlers/MovementHandler.cpp | 2 -- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/game/Anticheat/MovementAnticheat/MovementAnticheat.cpp b/src/game/Anticheat/MovementAnticheat/MovementAnticheat.cpp index 9e573ec8dab..1fff83e7cab 100644 --- a/src/game/Anticheat/MovementAnticheat/MovementAnticheat.cpp +++ b/src/game/Anticheat/MovementAnticheat/MovementAnticheat.cpp @@ -812,19 +812,29 @@ uint32 MovementAnticheat::HandleFlagTests(Player* pPlayer, MovementInfo& movemen } #undef APPEND_CHEAT - AddCheats(cheatFlags); - - if (ShouldRejectMovement(cheatFlags) && - me->movespline->Finalized() && - !me->IsBeingTeleported()) + if (cheatFlags) { - me->RemoveUnitMovementFlag(removeMoveFlags); - me->ResolvePendingMovementChanges(true, true); - me->SendHeartBeat(true); - return WorldTimer::getMSTime() + 100 + std::min(1000u, sWorld.GetCurrentDiff() + m_session->GetLatency()); + // Since we dont require client confirmation for flag changes + // during move splines, it's possible for client to not have + // yet processed the changes when the move spline expires. + // So just ignore this packet and dont send forced update. + if (opcode == CMSG_MOVE_SPLINE_DONE) + return 1; + + AddCheats(cheatFlags); + + if (ShouldRejectMovement(cheatFlags) && + me->movespline->Finalized() && + !me->IsBeingTeleported()) + { + me->RemoveUnitMovementFlag(removeMoveFlags); + me->ResolvePendingMovementChanges(true, true); + me->SendHeartBeat(true); + return WorldTimer::getMSTime() + 100 + std::min(1000u, sWorld.GetCurrentDiff() + m_session->GetLatency()); + } + else if (removeMoveFlags) + movementInfo.RemoveMovementFlag(removeMoveFlags); } - else if (removeMoveFlags) - movementInfo.RemoveMovementFlag(removeMoveFlags); return 0; } diff --git a/src/game/Handlers/MovementHandler.cpp b/src/game/Handlers/MovementHandler.cpp index d58c2d2d5e3..eb4c8f62434 100644 --- a/src/game/Handlers/MovementHandler.cpp +++ b/src/game/Handlers/MovementHandler.cpp @@ -865,9 +865,7 @@ void WorldSession::HandleMoveSplineDoneOpcode(WorldPacket& recvData) return; if (m_moveRejectTime = _player->GetCheatData()->HandleFlagTests(pPlayerMover, movementInfo, CMSG_MOVE_SPLINE_DONE)) - { return; - } } HandleMoverRelocation(pMover, movementInfo);