summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/being.cpp3
-rw-r--r--src/being.h8
-rw-r--r--src/net/tmwa/beinghandler.cpp48
3 files changed, 45 insertions, 14 deletions
diff --git a/src/being.cpp b/src/being.cpp
index 2f2e69d16..e66f3284b 100644
--- a/src/being.cpp
+++ b/src/being.cpp
@@ -187,6 +187,7 @@ Being::Being(int id, Type type, Uint16 subtype, Map *map):
mAction(STAND),
mSubType(0xFFFF),
mDirection(DOWN),
+ mDirectionDelayed(0),
mSpriteDirection(DIRECTION_DOWN),
mDispName(0),
mShowName(false),
@@ -947,6 +948,8 @@ void Being::setDirection(Uint8 direction)
mDirection = direction;
+ mDirectionDelayed = 0;
+
// if the direction does not change much, keep the common component
int mFaceDirection = mDirection & direction;
if (!mFaceDirection)
diff --git a/src/being.h b/src/being.h
index 1d5ca7c19..1dc2fd8f8 100644
--- a/src/being.h
+++ b/src/being.h
@@ -452,6 +452,12 @@ class Being : public ActorSprite, public ConfigListener
*/
virtual void setDirection(Uint8 direction);
+ virtual void setDirectionDelayed(Uint8 direction)
+ { mDirectionDelayed = direction; }
+
+ Uint8 getDirectionDelayed()
+ { return mDirectionDelayed; }
+
/**
* Returns the direction the being is facing.
*/
@@ -677,6 +683,8 @@ class Being : public ActorSprite, public ConfigListener
Uint16 mSubType; /**< Subtype (graphical view, basically) */
Uint8 mDirection; /**< Facing direction */
+ Uint8 mDirectionDelayed; /**< Facing direction */
+
Uint8 mSpriteDirection; /**< Facing direction */
std::string mName; /**< Name of character */
std::string mPartyName;
diff --git a/src/net/tmwa/beinghandler.cpp b/src/net/tmwa/beinghandler.cpp
index 2d0ae3c70..fb3ac44be 100644
--- a/src/net/tmwa/beinghandler.cpp
+++ b/src/net/tmwa/beinghandler.cpp
@@ -168,6 +168,7 @@ void BeingHandler::handleMessage(Net::MessageIn &msg)
int hairStyle, hairColor, flag;
int hp, maxHP, oldHP;
unsigned char colors[9];
+ Uint8 dir;
switch (msg.getId())
{
@@ -859,6 +860,13 @@ void BeingHandler::handleMessage(Net::MessageIn &msg)
break;
}
+ dir = dstBeing->getDirectionDelayed();
+ if (dir)
+ {
+ if (dir != dstBeing->getDirection())
+ dstBeing->setDirection(dir);
+ }
+
if (Party *party = player_node->getParty())
{
if (party->isMember(id))
@@ -941,18 +949,26 @@ void BeingHandler::handleMessage(Net::MessageIn &msg)
// because server dont send direction in move packet,
// we fixing it
- int dir = 0;
- if (dstX > srcX)
- dir |= Being::RIGHT;
- else if (dstX < srcX)
- dir |= Being::LEFT;
- if (dstY > srcY)
- dir |= Being::DOWN;
- else if (dstY < srcY)
- dir |= Being::UP;
-
- if (dir)
- dstBeing->setDirection(dir);
+ if (srcX != dstX || srcY != dstY)
+ {
+ int dir = 0;
+ if (dstX > srcX)
+ dir |= Being::RIGHT;
+ else if (dstX < srcX)
+ dir |= Being::LEFT;
+ if (dstY > srcY)
+ dir |= Being::DOWN;
+ else if (dstY < srcY)
+ dir |= Being::UP;
+
+ if (dir && dstBeing->getDirection() != dir)
+ {
+ dstBeing->setDirectionDelayed(dir);
+// dstBeing->clearPath();
+// dstBeing->reset();
+ }
+ }
+
if (player_node->getCurrentAction() != Being::STAND)
player_node->imitateAction(dstBeing, Being::STAND);
@@ -1023,8 +1039,12 @@ void BeingHandler::handleMessage(Net::MessageIn &msg)
msg.readInt8(); // unknown
- dstBeing->setActionTime(tick_time);
- dstBeing->reset();
+ if (dstBeing->getType() != Being::PLAYER
+ || msg.getId() != SMSG_PLAYER_MOVE)
+ {
+ dstBeing->setActionTime(tick_time);
+// dstBeing->reset();
+ }
dstBeing->setStunMode(stunMode);
dstBeing->setStatusEffectBlock(0, (statusEffects >> 16) & 0xffff);