fix(Core/Movement): Properly handled root movement acks. (#8019)

Fixes #7892
This commit is contained in:
UltraNix
2021-10-01 10:41:31 +02:00
committed by GitHub
parent 7001865186
commit 0c8fb1ea73
3 changed files with 111 additions and 112 deletions
-50
View File
@@ -983,56 +983,6 @@ void WorldSession::HandleFeatherFallAck(WorldPacket& recv_data)
recv_data.rfinish(); // prevent warnings spam
}
void WorldSession::HandleMoveUnRootAck(WorldPacket& recv_data)
{
// no used
recv_data.rfinish(); // prevent warnings spam
/*
ObjectGuid guid;
recv_data >> guid;
// now can skip not our packet
if (_player->GetGUID() != guid)
{
recv_data.rfinish(); // prevent warnings spam
return;
}
LOG_DEBUG("network.opcode", "WORLD: CMSG_FORCE_MOVE_UNROOT_ACK");
recv_data.read_skip<uint32>(); // unk
MovementInfo movementInfo;
movementInfo.guid = guid;
ReadMovementInfo(recv_data, &movementInfo);
recv_data.read_skip<float>(); // unk2
*/
}
void WorldSession::HandleMoveRootAck(WorldPacket& recv_data)
{
// no used
recv_data.rfinish(); // prevent warnings spam
/*
ObjectGuid guid;
recv_data >> guid;
// now can skip not our packet
if (_player->GetGUID() != guid)
{
recv_data.rfinish(); // prevent warnings spam
return;
}
LOG_DEBUG("network.opcode", "WORLD: CMSG_FORCE_MOVE_ROOT_ACK");
recv_data.read_skip<uint32>(); // unk
MovementInfo movementInfo;
ReadMovementInfo(recv_data, &movementInfo);
*/
}
void WorldSession::HandleSetActionBarToggles(WorldPacket& recv_data)
{
uint8 ActionBar;
@@ -926,3 +926,83 @@ void WorldSession::ComputeNewClockDelta()
_timeSyncClockDelta = back.first;
}
}
void WorldSession::HandleMoveRootAck(WorldPacket& recvData)
{
ObjectGuid guid;
recvData >> guid.ReadAsPacked();
Unit* mover = _player->m_mover;
if (!mover || guid != mover->GetGUID())
{
recvData.rfinish(); // prevent warnings spam
return;
}
uint32 movementCounter;
recvData >> movementCounter;
MovementInfo movementInfo;
movementInfo.guid = guid;
ReadMovementInfo(recvData, &movementInfo);
/* process position-change */
int64 movementTime = (int64) movementInfo.time + _timeSyncClockDelta;
if (_timeSyncClockDelta == 0 || movementTime < 0 || movementTime > 0xFFFFFFFF)
{
LOG_INFO("misc", "The computed movement time using clockDelta is erronous. Using fallback instead");
movementInfo.time = getMSTime();
}
else
{
movementInfo.time = (uint32)movementTime;
}
movementInfo.guid = mover->GetGUID();
mover->m_movementInfo = movementInfo;
mover->UpdatePosition(movementInfo.pos);
WorldPacket data(MSG_MOVE_ROOT, 64);
WriteMovementInfo(&data, &movementInfo);
mover->SendMessageToSet(&data, _player);
}
void WorldSession::HandleMoveUnRootAck(WorldPacket& recvData)
{
ObjectGuid guid;
recvData >> guid.ReadAsPacked();
Unit* mover = _player->m_mover;
if (!mover || guid != mover->GetGUID())
{
recvData.rfinish(); // prevent warnings spam
return;
}
uint32 movementCounter;
recvData >> movementCounter;
MovementInfo movementInfo;
movementInfo.guid = guid;
ReadMovementInfo(recvData, &movementInfo);
/* process position-change */
int64 movementTime = (int64) movementInfo.time + _timeSyncClockDelta;
if (_timeSyncClockDelta == 0 || movementTime < 0 || movementTime > 0xFFFFFFFF)
{
LOG_INFO("misc", "The computed movement time using clockDelta is erronous. Using fallback instead");
movementInfo.time = getMSTime();
}
else
{
movementInfo.time = (uint32)movementTime;
}
movementInfo.guid = mover->GetGUID();
mover->m_movementInfo = movementInfo;
mover->UpdatePosition(movementInfo.pos);
WorldPacket data(MSG_MOVE_UNROOT, 64);
WriteMovementInfo(&data, &movementInfo);
mover->SendMessageToSet(&data, _player);
}