From 4177c05ce345bdb2982c3033f19a1cb19d72788d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Viste=28=D0=9A=D0=B8=D1=80=D0=B8=D0=BB=D0=BB=29?= Date: Sun, 3 Mar 2019 14:10:43 +0300 Subject: [PATCH] feat(Core/Movement): Implement move time skipped handler (#1433) --- src/server/game/Handlers/MiscHandler.cpp | 8 ----- src/server/game/Handlers/MovementHandler.cpp | 34 ++++++++++++++++++++ 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index ccaacf408..2dff62170 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -1136,14 +1136,6 @@ void WorldSession::HandleNextCinematicCamera(WorldPacket & /*recv_data*/) #endif } -void WorldSession::HandleMoveTimeSkippedOpcode(WorldPacket & recv_data) -{ - uint64 guid; - uint32 time_skipped; - recv_data.readPackGUID(guid); - recv_data >> time_skipped; -} - void WorldSession::HandleFeatherFallAck(WorldPacket &recv_data) { #if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS) diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index e62bf28cf..546c2fc97 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -725,3 +725,37 @@ void WorldSession::HandleSummonResponseOpcode(WorldPacket& recvData) _player->SetSummonAsSpectator(false); _player->SummonIfPossible(agree, summoner_guid); } + +void WorldSession::HandleMoveTimeSkippedOpcode(WorldPacket& recvData) +{ +#if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS) + sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recvd CMSG_MOVE_TIME_SKIPPED"); +#endif + + uint64 guid; + uint32 timeSkipped; + recvData.readPackGUID(guid); + recvData >> timeSkipped; + + Unit* mover = GetPlayer()->m_mover; + + if (!mover) + { + sLog->outError("WorldSession::HandleMoveTimeSkippedOpcode wrong mover state from the unit moved by the player [" UI64FMTD "]", GetPlayer()->GetGUID()); + return; + } + + // prevent tampered movement data + if (guid != mover->GetGUID()) + { + sLog->outError("WorldSession::HandleMoveTimeSkippedOpcode wrong guid from the unit moved by the player [" UI64FMTD "]", GetPlayer()->GetGUID()); + return; + } + + mover->m_movementInfo.time += timeSkipped; + + WorldPacket data(MSG_MOVE_TIME_SKIPPED, recvData.size()); + data.appendPackGUID(guid); + data << timeSkipped; + GetPlayer()->SendMessageToSet(&data, false); +}