Skip to content

Commit c4499cf

Browse files
committed
Merge pull request #14386 from Gigi1237/SpeedAck
Core/PacketIO: Updated and enabled _SPEED_CHANGE_ACK
2 parents 8464674 + 5a8db92 commit c4499cf

5 files changed

Lines changed: 63 additions & 31 deletions

File tree

src/server/game/Handlers/MovementHandler.cpp

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -392,22 +392,16 @@ void WorldSession::HandleMovementOpcodes(WorldPackets::Movement::ClientPlayerMov
392392
}
393393
}
394394

395-
void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recvData)
395+
void WorldSession::HandleForceSpeedChangeAck(WorldPackets::Movement::MovementSpeedAck& packet)
396396
{
397-
/* extract packet */
398-
MovementInfo movementInfo;
399-
static MovementStatusElements const speedElement = MSEExtraFloat;
400-
Movement::ExtraMovementStatusElement extras(&speedElement);
401-
GetPlayer()->ReadMovementInfo(recvData, &movementInfo, &extras);
397+
OpcodeClient opcode = packet.GetOpcode();
402398

403399
// now can skip not our packet
404-
if (_player->GetGUID() != movementInfo.guid)
400+
if (_player->GetGUID() != packet.movementInfo.guid)
405401
{
406-
recvData.rfinish(); // prevent warnings spam
407402
return;
408403
}
409404

410-
float newspeed = extras.Data.floatData;
411405
/*----------------*/
412406

413407
// client ACK send one packet for mounted/run case and need skip all except last from its
@@ -427,21 +421,21 @@ void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recvData)
427421
"PitchRate"
428422
};
429423

430-
switch (recvData.GetOpcode())
424+
switch (opcode)
431425
{
432-
/*
426+
433427
case CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK: move_type = MOVE_WALK; break;
434428
case CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK: move_type = MOVE_RUN; break;
435429
case CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK: move_type = MOVE_RUN_BACK; break;
436430
case CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK: move_type = MOVE_SWIM; break;
437-
case CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK: move_type = MOVE_SWIM_BACK; break;
438-
case CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK: move_type = MOVE_TURN_RATE; break;
431+
//case CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK: move_type = MOVE_SWIM_BACK; break;
432+
//case CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK: move_type = MOVE_TURN_RATE; break;
439433
case CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT; break;
440-
case CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT_BACK; break;
441-
case CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK: move_type = MOVE_PITCH_RATE; break;
442-
*/
434+
//case CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT_BACK; break;
435+
//case CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK: move_type = MOVE_PITCH_RATE; break;
436+
443437
default:
444-
TC_LOG_ERROR("network", "WorldSession::HandleForceSpeedChangeAck: Unknown move type opcode: %u", recvData.GetOpcode());
438+
TC_LOG_ERROR("network", "WorldSession::HandleForceSpeedChangeAck: Unknown move type opcode: %u", opcode);
445439
return;
446440
}
447441

@@ -454,18 +448,18 @@ void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recvData)
454448
return;
455449
}
456450

457-
if (!_player->GetTransport() && std::fabs(_player->GetSpeed(move_type) - newspeed) > 0.01f)
451+
if (!_player->GetTransport() && std::fabs(_player->GetSpeed(move_type) - packet.Speed) > 0.01f)
458452
{
459-
if (_player->GetSpeed(move_type) > newspeed) // must be greater - just correct
453+
if (_player->GetSpeed(move_type) > packet.Speed) // must be greater - just correct
460454
{
461455
TC_LOG_ERROR("network", "%sSpeedChange player %s is NOT correct (must be %f instead %f), force set to correct value",
462-
move_type_name[move_type], _player->GetName().c_str(), _player->GetSpeed(move_type), newspeed);
456+
move_type_name[move_type], _player->GetName().c_str(), _player->GetSpeed(move_type), packet.Speed);
463457
_player->SetSpeed(move_type, _player->GetSpeedRate(move_type), true);
464458
}
465459
else // must be lesser - cheating
466460
{
467461
TC_LOG_DEBUG("misc", "Player %s from account id %u kicked for incorrect speed (must be %f instead %f)",
468-
_player->GetName().c_str(), _player->GetSession()->GetAccountId(), _player->GetSpeed(move_type), newspeed);
462+
_player->GetName().c_str(), _player->GetSession()->GetAccountId(), _player->GetSpeed(move_type), packet.Speed);
469463
_player->GetSession()->KickPlayer();
470464
}
471465
}

src/server/game/Server/Packets/MovementPackets.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -595,3 +595,16 @@ void WorldPackets::Movement::MoveTeleportAck::Read()
595595
_worldPacket >> AckIndex;
596596
_worldPacket >> MoveTime;
597597
}
598+
599+
void WorldPackets::Movement::MovementAck::Read()
600+
{
601+
_worldPacket >> movementInfo;
602+
_worldPacket >> AckIndex;
603+
}
604+
605+
void WorldPackets::Movement::MovementSpeedAck::Read()
606+
{
607+
_worldPacket >> movementInfo;
608+
_worldPacket >> AckIndex;
609+
_worldPacket >> Speed;
610+
}

src/server/game/Server/Packets/MovementPackets.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,29 @@ namespace WorldPackets
285285
int32 AckIndex = 0;
286286
int32 MoveTime = 0;
287287
};
288+
289+
class MovementAck final : public ClientPacket
290+
{
291+
public:
292+
MovementAck(WorldPacket&& packet) : ClientPacket(std::move(packet)) { }
293+
294+
void Read() override;
295+
296+
MovementInfo movementInfo;
297+
int32 AckIndex = 0;
298+
};
299+
300+
class MovementSpeedAck final : public ClientPacket
301+
{
302+
public:
303+
MovementSpeedAck(WorldPacket&& packet) : ClientPacket(std::move(packet)) { }
304+
305+
void Read() override;
306+
307+
MovementInfo movementInfo;
308+
int32 AckIndex = 0;
309+
float Speed = 0.0f;
310+
};
288311
}
289312

290313
ByteBuffer& operator<<(ByteBuffer& data, Movement::MonsterSplineFilterKey const& monsterSplineFilterKey);

src/server/game/Server/Protocol/Opcodes.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -544,17 +544,17 @@ void OpcodeTable::Initialize()
544544
DEFINE_HANDLER(CMSG_MOVE_FALL_LAND, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
545545
DEFINE_HANDLER(CMSG_MOVE_FALL_RESET, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
546546
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FEATHER_FALL_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleFeatherFallAck );
547-
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck );
548-
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck );
549-
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck );
547+
DEFINE_HANDLER(CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, WorldPackets::Movement::MovementSpeedAck, &WorldSession::HandleForceSpeedChangeAck);
548+
DEFINE_HANDLER(CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::MovementSpeedAck, &WorldSession::HandleForceSpeedChangeAck);
549+
DEFINE_HANDLER(CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, WorldPackets::Movement::MovementSpeedAck, &WorldSession::HandleForceSpeedChangeAck);
550550
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_ROOT_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleMoveRootAck );
551-
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck );
552-
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck );
553-
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck );
554-
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck );
555-
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck );
551+
DEFINE_HANDLER(CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::MovementSpeedAck, &WorldSession::HandleForceSpeedChangeAck);
552+
DEFINE_HANDLER(CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::MovementSpeedAck, &WorldSession::HandleForceSpeedChangeAck);
553+
DEFINE_HANDLER(CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, WorldPackets::Movement::MovementSpeedAck, &WorldSession::HandleForceSpeedChangeAck);
554+
DEFINE_HANDLER(CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::MovementSpeedAck, &WorldSession::HandleForceSpeedChangeAck);
555+
DEFINE_HANDLER(CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, WorldPackets::Movement::MovementSpeedAck, &WorldSession::HandleForceSpeedChangeAck);
556556
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_UNROOT_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleMoveUnRootAck );
557-
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck );
557+
DEFINE_HANDLER(CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::MovementSpeedAck, &WorldSession::HandleForceSpeedChangeAck);
558558
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_GRAVITY_DISABLE_ACK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
559559
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_GRAVITY_ENABLE_ACK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
560560
DEFINE_HANDLER(CMSG_MOVE_HEARTBEAT, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);

src/server/game/Server/WorldSession.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,8 @@ namespace WorldPackets
287287
class ClientPlayerMovement;
288288
class WorldPortAck;
289289
class MoveTeleportAck;
290+
class MovementAck;
291+
class MovementSpeedAck;
290292
}
291293

292294
namespace NPC
@@ -838,7 +840,7 @@ class WorldSession
838840
void HandleMoveKnockBackAck(WorldPacket& recvPacket);
839841

840842
void HandleMoveTeleportAck(WorldPackets::Movement::MoveTeleportAck& packet);
841-
void HandleForceSpeedChangeAck(WorldPacket& recvData);
843+
void HandleForceSpeedChangeAck(WorldPackets::Movement::MovementSpeedAck& packet);
842844
void HandleSetCollisionHeightAck(WorldPacket& recvPacket);
843845

844846
void HandlePingOpcode(WorldPacket& recvPacket);

0 commit comments

Comments
 (0)