summaryrefslogtreecommitdiff
path: root/src/localplayer.cpp
diff options
context:
space:
mode:
authorYohann Ferreira <yohann_dot_ferreira_at_orange_dot_efer>2012-01-18 16:31:05 +0100
committerYohann Ferreira <yohann_dot_ferreira_at_orange_dot_efer>2012-01-18 22:06:40 +0100
commite554d9b2be1ec2fcb15065ae70151302adeef602 (patch)
tree7ed91e2cc9ec4e2049d4438e0682d1b62ed7590f /src/localplayer.cpp
parentd706e45af52a25a2a0032d1161a3c4423a63eae2 (diff)
downloadmana-client-e554d9b2be1ec2fcb15065ae70151302adeef602.tar.gz
mana-client-e554d9b2be1ec2fcb15065ae70151302adeef602.tar.bz2
mana-client-e554d9b2be1ec2fcb15065ae70151302adeef602.tar.xz
mana-client-e554d9b2be1ec2fcb15065ae70151302adeef602.zip
Found a better way to fix the movement glitches on both servers.
The patch also takes care of not spamming the different servers, when the servers are setting the being speed correctly. The most problems were coming from the keyboard movement functions handling 1 tile paths. To void the issues seen in #405, #439, and #440, I simply prevented to set a new path before reaching the destination of the former one, when using the keyboard. The mouse path system remains unchanged. I also made some functions private (or here protected) to show they shouldn't be called by something else than the localplayer object. And I removed the nextTile() function, since it was obsolete, unused, and replaced by the nextTile(direction) function. That patch was tested on both servers with mouse/keyboard mixed use. Resolves: Mana-Mantis #405, #439, #440. Reviewed-by: bjorn
Diffstat (limited to 'src/localplayer.cpp')
-rw-r--r--src/localplayer.cpp22
1 files changed, 7 insertions, 15 deletions
diff --git a/src/localplayer.cpp b/src/localplayer.cpp
index 1e790d44..28f26755 100644
--- a/src/localplayer.cpp
+++ b/src/localplayer.cpp
@@ -74,7 +74,6 @@ LocalPlayer::LocalPlayer(int id, int subtype):
mWalkingDir(0),
mPathSetByMouse(false),
mLocalWalkTime(-1),
- mKeyboardMoveDelay(500),
mMessageTime(0),
mShowIp(false),
mAwayDialog(0),
@@ -712,10 +711,14 @@ void LocalPlayer::setWalkingDir(int dir)
{
// This function is called by Game::handleInput()
- // First if player is pressing key for the direction he is already
- // going, do nothing more...
+ // Don't compute a new path before the last one set by keyboard is finished.
+ // This permits to avoid movement glitches and server spamming.
+ const Vector &pos = getPosition();
+ const Vector &dest = getDestination();
+ if (!isPathSetByMouse() && (pos.x != dest.x || pos.y != dest.y))
+ return;
- // Else if he is pressing a key, and its different from what he has
+ // If the player is pressing a key, and its different from what he has
// been pressing, stop (do not send this stop to the server) and
// start in the new direction
if (dir && (dir != getWalkingDir()))
@@ -728,12 +731,7 @@ void LocalPlayer::setWalkingDir(int dir)
else if (!dir)
return;
- // If the delay to send another walk message to the server hasn't expired,
- // don't do anything or we could get disconnected for spamming the server
- if (get_elapsed_time(mLocalWalkTime) < mKeyboardMoveDelay)
- return;
mLocalWalkTime = tick_time;
-
mWalkingDir = dir;
// If we're not already walking, start walking.
@@ -798,12 +796,6 @@ void LocalPlayer::stopWalking(bool sendToServer)
clearPath();
}
-void LocalPlayer::setMoveSpeed(const Vector& speed)
-{
- Being::setMoveSpeed(speed);
- mKeyboardMoveDelay = Net::getPlayerHandler()->getKeyboardMoveDelay(speed);
-}
-
void LocalPlayer::toggleSit()
{
if (mLastAction != -1)