summaryrefslogtreecommitdiff
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
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
-rw-r--r--src/localplayer.cpp22
-rw-r--r--src/localplayer.h51
-rw-r--r--src/net/manaserv/playerhandler.cpp8
-rw-r--r--src/net/manaserv/playerhandler.h2
-rw-r--r--src/net/playerhandler.h6
-rw-r--r--src/net/tmwa/playerhandler.cpp5
-rw-r--r--src/net/tmwa/playerhandler.h2
7 files changed, 26 insertions, 70 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)
diff --git a/src/localplayer.h b/src/localplayer.h
index e3849126..554312c8 100644
--- a/src/localplayer.h
+++ b/src/localplayer.h
@@ -79,23 +79,6 @@ class LocalPlayer : public Being
virtual void setAction(Action action, int attackId = 1);
/**
- * Compute the next pathnode location when walking using keyboard.
- * used by nextTile().
- */
- Position getNextWalkPosition(unsigned char dir);
-
- /**
- * Adds a new tile to the path when walking.
- * @note Eathena
- * Also, when specified, it picks up an item at the end of a path
- * or attack target.
- */
- virtual void nextTile()
- { nextTile(0); }
-
- virtual void nextTile(unsigned char dir);
-
- /**
* Check the player has permission to invite users to specific guild
*/
bool checkInviteRights(const std::string &guildName);
@@ -147,15 +130,14 @@ class LocalPlayer : public Being
*/
void setTarget(Being *target);
- void setMoveSpeed(const Vector &speed);
-
/**
* Sets a new destination for this being to walk to.
*/
virtual void setDestination(int x, int y);
/**
- * Sets a new direction to keep walking in.
+ * Sets a new direction to keep walking in, when using the keyboard
+ * or the joystick.
*/
void setWalkingDir(int dir);
@@ -175,11 +157,6 @@ class LocalPlayer : public Being
*/
bool withinAttackRange(Being *target);
- /**
- * Stops the player dead in his tracks
- */
- void stopWalking(bool sendToServer = true);
-
void toggleSit();
void emote(uint8_t emotion);
@@ -233,8 +210,25 @@ class LocalPlayer : public Being
/** Whether or not the name settings have changed */
bool mUpdateName;
+ /** Make the character starts to walk. */
void startWalking(unsigned char dir);
+ /**
+ * Stops the player dead in his tracks
+ */
+ void stopWalking(bool sendToServer = true);
+
+ /**
+ * set the next path tile when walking and using the keyboard.
+ */
+ virtual void nextTile(unsigned char dir);
+
+ /**
+ * Compute the next pathnode location when walking using keyboard.
+ * used by nextTile().
+ */
+ Position getNextWalkPosition(unsigned char dir);
+
int mAttackRange;
int mTargetTime; /** How long the being has been targeted **/
@@ -255,13 +249,6 @@ class LocalPlayer : public Being
int mLocalWalkTime; /**< Timestamp used to control keyboard walk
messages flooding */
- /**
- * The delay between two permitted setDestination() call using
- * the keyboard.
- * It's set in milliseconds per tile.
- */
- int mKeyboardMoveDelay;
-
typedef std::pair<std::string, int> MessagePair;
/** Queued messages*/
std::list<MessagePair> mMessages;
diff --git a/src/net/manaserv/playerhandler.cpp b/src/net/manaserv/playerhandler.cpp
index 43af40f5..aa670ad8 100644
--- a/src/net/manaserv/playerhandler.cpp
+++ b/src/net/manaserv/playerhandler.cpp
@@ -442,12 +442,4 @@ Vector PlayerHandler::getPixelsPerTickMoveSpeed(const Vector &speed, Map *map)
return speedInTicks;
}
-int PlayerHandler::getKeyboardMoveDelay(const Vector& speed)
-{
- int maxSpeed = std::max(speed.x, speed.y);
- if (maxSpeed <= 0)
- maxSpeed = 2;
- return 1000 / maxSpeed;
-}
-
} // namespace ManaServ
diff --git a/src/net/manaserv/playerhandler.h b/src/net/manaserv/playerhandler.h
index 0edb4354..3e3f8aad 100644
--- a/src/net/manaserv/playerhandler.h
+++ b/src/net/manaserv/playerhandler.h
@@ -69,8 +69,6 @@ class PlayerHandler : public MessageHandler, public Net::PlayerHandler
Vector getPixelsPerTickMoveSpeed(const Vector &speed, Map *map = 0);
- int getKeyboardMoveDelay(const Vector& speed);
-
bool usePixelPrecision()
{ return true; }
diff --git a/src/net/playerhandler.h b/src/net/playerhandler.h
index b52b6315..6ac28b62 100644
--- a/src/net/playerhandler.h
+++ b/src/net/playerhandler.h
@@ -77,12 +77,6 @@ class PlayerHandler
Map *map = 0) = 0;
/**
- * Convert the original speed into the keyboard move delay.
- * The delay is set in milliseconds per tiles.
- */
- virtual int getKeyboardMoveDelay(const Vector& speed) = 0;
-
- /**
* Tells whether the client has to use pixel paths.
* Return false when tiles-center positions only are to be used.
*/
diff --git a/src/net/tmwa/playerhandler.cpp b/src/net/tmwa/playerhandler.cpp
index f91d8573..132e45ee 100644
--- a/src/net/tmwa/playerhandler.cpp
+++ b/src/net/tmwa/playerhandler.cpp
@@ -662,9 +662,4 @@ Vector PlayerHandler::getPixelsPerTickMoveSpeed(const Vector &speed, Map *map)
return speedInTicks;
}
-int PlayerHandler::getKeyboardMoveDelay(const Vector& speed)
-{
- return std::min(speed.x, speed.y) * MILLISECONDS_IN_A_TICK;
-}
-
} // namespace TmwAthena
diff --git a/src/net/tmwa/playerhandler.h b/src/net/tmwa/playerhandler.h
index 3e22be22..63812f47 100644
--- a/src/net/tmwa/playerhandler.h
+++ b/src/net/tmwa/playerhandler.h
@@ -62,8 +62,6 @@ class PlayerHandler : public MessageHandler, public Net::PlayerHandler
Vector getPixelsPerTickMoveSpeed(const Vector &speed, Map *map = 0);
- int getKeyboardMoveDelay(const Vector& speed);
-
bool usePixelPrecision()
{ return false; }
};