aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/MovementHandler.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2019-09-07 16:58:58 +0200
committerShauren <shauren.trinity@gmail.com>2019-09-07 16:58:58 +0200
commit8e98ceb2936842ea0032cbfdc04a510d6b1e5de0 (patch)
treeabb48f72a728cc97af6e934de1310047b5725341 /src/server/game/Handlers/MovementHandler.cpp
parente0a0dbe41c5ed0db078d0897d54f3cd8f75abc99 (diff)
Core/Movement: Implemented movement forces
Diffstat (limited to 'src/server/game/Handlers/MovementHandler.cpp')
-rw-r--r--src/server/game/Handlers/MovementHandler.cpp86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp
index 9ff173b8add..465a1e49239 100644
--- a/src/server/game/Handlers/MovementHandler.cpp
+++ b/src/server/game/Handlers/MovementHandler.cpp
@@ -572,6 +572,92 @@ void WorldSession::HandleSetCollisionHeightAck(WorldPackets::Movement::MoveSetCo
GetPlayer()->ValidateMovementInfo(&setCollisionHeightAck.Data.Status);
}
+void WorldSession::HandleMoveApplyMovementForceAck(WorldPackets::Movement::MoveApplyMovementForceAck& moveApplyMovementForceAck)
+{
+ Unit* mover = _player->m_unitMovedByMe;
+ ASSERT(mover != nullptr);
+ _player->ValidateMovementInfo(&moveApplyMovementForceAck.Ack.Status);
+
+ // prevent tampered movement data
+ if (moveApplyMovementForceAck.Ack.Status.guid != mover->GetGUID())
+ {
+ TC_LOG_ERROR("network", "HandleMoveApplyMovementForceAck: guid error, expected %s, got %s",
+ mover->GetGUID().ToString().c_str(), moveApplyMovementForceAck.Ack.Status.guid.ToString().c_str());
+ return;
+ }
+
+ moveApplyMovementForceAck.Ack.Status.time += m_clientTimeDelay + MOVEMENT_PACKET_TIME_DELAY;
+
+ WorldPackets::Movement::MoveUpdateApplyMovementForce updateApplyMovementForce;
+ updateApplyMovementForce.Status = &moveApplyMovementForceAck.Ack.Status;
+ updateApplyMovementForce.Force = &moveApplyMovementForceAck.Force;
+ mover->SendMessageToSet(updateApplyMovementForce.Write(), false);
+}
+
+void WorldSession::HandleMoveRemoveMovementForceAck(WorldPackets::Movement::MoveRemoveMovementForceAck& moveRemoveMovementForceAck)
+{
+ Unit* mover = _player->m_unitMovedByMe;
+ ASSERT(mover != nullptr);
+ _player->ValidateMovementInfo(&moveRemoveMovementForceAck.Ack.Status);
+
+ // prevent tampered movement data
+ if (moveRemoveMovementForceAck.Ack.Status.guid != mover->GetGUID())
+ {
+ TC_LOG_ERROR("network", "HandleMoveRemoveMovementForceAck: guid error, expected %s, got %s",
+ mover->GetGUID().ToString().c_str(), moveRemoveMovementForceAck.Ack.Status.guid.ToString().c_str());
+ return;
+ }
+
+ moveRemoveMovementForceAck.Ack.Status.time += m_clientTimeDelay + MOVEMENT_PACKET_TIME_DELAY;
+
+ WorldPackets::Movement::MoveUpdateRemoveMovementForce updateRemoveMovementForce;
+ updateRemoveMovementForce.Status = &moveRemoveMovementForceAck.Ack.Status;
+ updateRemoveMovementForce.TriggerGUID = moveRemoveMovementForceAck.ID;
+ mover->SendMessageToSet(updateRemoveMovementForce.Write(), false);
+}
+
+void WorldSession::HandleMoveSetModMovementForceMagnitudeAck(WorldPackets::Movement::MovementSpeedAck& setModMovementForceMagnitudeAck)
+{
+ Unit* mover = _player->m_unitMovedByMe;
+ ASSERT(mover != nullptr); // there must always be a mover
+ _player->ValidateMovementInfo(&setModMovementForceMagnitudeAck.Ack.Status);
+
+ // prevent tampered movement data
+ if (setModMovementForceMagnitudeAck.Ack.Status.guid != mover->GetGUID())
+ {
+ TC_LOG_ERROR("network", "HandleSetModMovementForceMagnitudeAck: guid error, expected %s, got %s",
+ mover->GetGUID().ToString().c_str(), setModMovementForceMagnitudeAck.Ack.Status.guid.ToString().c_str());
+ return;
+ }
+
+ // skip all except last
+ if (_player->m_movementForceModMagnitudeChanges > 0)
+ {
+ --_player->m_movementForceModMagnitudeChanges;
+ if (!_player->m_movementForceModMagnitudeChanges)
+ {
+ float expectedModMagnitude = 1.0f;
+ if (MovementForces const* movementForces = mover->GetMovementForces())
+ expectedModMagnitude = movementForces->GetModMagnitude();
+
+ if (std::fabs(expectedModMagnitude - setModMovementForceMagnitudeAck.Speed) > 0.01f)
+ {
+ TC_LOG_DEBUG("misc", "Player %s from account id %u kicked for incorrect movement force magnitude (must be %f instead %f)",
+ _player->GetName().c_str(), _player->GetSession()->GetAccountId(), expectedModMagnitude, setModMovementForceMagnitudeAck.Speed);
+ _player->GetSession()->KickPlayer();
+ return;
+ }
+ }
+ }
+
+ setModMovementForceMagnitudeAck.Ack.Status.time += m_clientTimeDelay + MOVEMENT_PACKET_TIME_DELAY;
+
+ WorldPackets::Movement::MoveUpdateSpeed updateModMovementForceMagnitude(SMSG_MOVE_UPDATE_MOD_MOVEMENT_FORCE_MAGNITUDE);
+ updateModMovementForceMagnitude.Status = &setModMovementForceMagnitudeAck.Ack.Status;
+ updateModMovementForceMagnitude.Speed = setModMovementForceMagnitudeAck.Speed;
+ mover->SendMessageToSet(updateModMovementForceMagnitude.Write(), false);
+}
+
void WorldSession::HandleMoveTimeSkippedOpcode(WorldPackets::Movement::MoveTimeSkipped& /*moveTimeSkipped*/)
{
}