Core/Movement: Implement move time skipped handler (#22994)

* Implement CMSG_MOVE_TIME_SKIPPED handler and move it to MovementHandler.cpp

* Add better error handling

* Update MovementHandler.cpp

(cherry picked from commit f9ed72e351)
This commit is contained in:
Chaouki Dhib
2019-02-02 21:15:19 +01:00
committed by Shauren
parent e475cac631
commit 4507a02ada
4 changed files with 44 additions and 5 deletions

View File

@@ -651,10 +651,6 @@ void WorldSession::HandleMoveSetModMovementForceMagnitudeAck(WorldPackets::Movem
mover->SendMessageToSet(updateModMovementForceMagnitude.Write(), false);
}
void WorldSession::HandleMoveTimeSkippedOpcode(WorldPackets::Movement::MoveTimeSkipped& /*moveTimeSkipped*/)
{
}
void WorldSession::HandleMoveSplineDoneOpcode(WorldPackets::Movement::MoveSplineDone& moveSplineDone)
{
MovementInfo movementInfo = moveSplineDone.Status;
@@ -696,3 +692,27 @@ void WorldSession::HandleMoveSplineDoneOpcode(WorldPackets::Movement::MoveSpline
if (GetPlayer()->pvpInfo.IsHostile)
GetPlayer()->CastSpell(GetPlayer(), 2479, true);
}
void WorldSession::HandleMoveTimeSkippedOpcode(WorldPackets::Movement::MoveTimeSkipped& moveTimeSkipped)
{
Unit* mover = GetPlayer()->m_unitMovedByMe;
if (!mover)
{
TC_LOG_WARN("entities.player", "WorldSession::HandleMoveTimeSkippedOpcode wrong mover state from the unit moved by %s", GetPlayer()->GetGUID().ToString().c_str());
return;
}
// prevent tampered movement data
if (moveTimeSkipped.MoverGUID != mover->GetGUID())
{
TC_LOG_WARN("entities.player", "WorldSession::HandleMoveTimeSkippedOpcode wrong guid from the unit moved by %s", GetPlayer()->GetGUID().ToString().c_str());
return;
}
mover->m_movementInfo.time += moveTimeSkipped.TimeSkipped;
WorldPackets::Movement::MoveSkipTime moveSkipTime;
moveSkipTime.MoverGUID = moveTimeSkipped.MoverGUID;
moveSkipTime.TimeSkipped = moveTimeSkipped.TimeSkipped;
mover->SendMessageToSet(moveSkipTime.Write(), _player);
}

View File

@@ -918,6 +918,14 @@ void WorldPackets::Movement::MoveTimeSkipped::Read()
_worldPacket >> TimeSkipped;
}
WorldPacket const* WorldPackets::Movement::MoveSkipTime::Write()
{
_worldPacket << MoverGUID;
_worldPacket << TimeSkipped;
return &_worldPacket;
}
void WorldPackets::Movement::SummonResponse::Read()
{
_worldPacket >> SummonerGUID;

View File

@@ -546,6 +546,17 @@ namespace WorldPackets
uint32 TimeSkipped = 0;
};
class MoveSkipTime final : public ServerPacket
{
public:
MoveSkipTime() : ServerPacket(SMSG_MOVE_SKIP_TIME, 16 + 4) { }
WorldPacket const* Write() override;
ObjectGuid MoverGUID;
uint32 TimeSkipped = 0;
};
class SummonResponse final : public ClientPacket
{
public:

View File

@@ -1578,7 +1578,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_VEHICLE_REC_ID, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_WALK_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_WATER_WALK, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SKIP_TIME, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SKIP_TIME, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_DISABLE_COLLISION, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_DISABLE_GRAVITY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_ENABLE_COLLISION, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);