diff --git a/src/otclient/core/creature.cpp b/src/otclient/core/creature.cpp index ee3beb04..c434fad0 100644 --- a/src/otclient/core/creature.cpp +++ b/src/otclient/core/creature.cpp @@ -26,6 +26,7 @@ #include "map.h" #include "tile.h" #include "item.h" +#include "game.h" #include #include @@ -161,7 +162,7 @@ void Creature::walk(const Position& position, bool inverse) if(inverse) { Position positionDelta = m_position - position; - m_walkOffset = Point(positionDelta.x * 32, positionDelta.y * 32); + m_walkOffset = Point(positionDelta.x * Map::NUM_TILE_PIXELS, positionDelta.y * Map::NUM_TILE_PIXELS); } else m_walkOffset = Point(0, 0); @@ -178,6 +179,7 @@ void Creature::walk(const Position& position, bool inverse) float walkTime = 1000.0 * (float)groundSpeed / m_speed; walkTime = (walkTime == 0) ? 1000 : walkTime; + walkTime = std::ceil(walkTime / g_game.getServerBeat()) * g_game.getServerBeat(); bool sameWalk = m_walking && !m_inverseWalking && inverse; m_inverseWalking = inverse; @@ -237,9 +239,9 @@ void Creature::updateWalk() m_walkOffset.x = -totalPixelsWalked; } - if(totalPixelsWalked == 32 || m_type->dimensions[ThingType::AnimationPhases] == 0) + if(totalPixelsWalked == 32 || m_type->dimensions[ThingType::AnimationPhases] <= 1) m_animation = 0; - else if(m_type->dimensions[ThingType::AnimationPhases] > 0) + else if(m_type->dimensions[ThingType::AnimationPhases] > 1) m_animation = 1 + totalPixelsWalked * 4 / Map::NUM_TILE_PIXELS % (m_type->dimensions[ThingType::AnimationPhases] - 1); if(g_clock.ticks() > m_walkEnd) @@ -250,16 +252,9 @@ void Creature::updateWalk() void Creature::cancelWalk(Otc::Direction direction) { - if(m_walking) { - auto self = asCreature(); - g_dispatcher.scheduleEvent([=]() { - if(!self->m_walking) - self->m_animation = 0; - }, m_walkTimePerPixel * 2); - } - m_walking = false; m_walkStart = 0; + m_animation = 0; m_walkOffset = Point(0, 0); setDirection(direction); } diff --git a/src/otclient/core/game.h b/src/otclient/core/game.h index 73de4ab7..a17d9ff2 100644 --- a/src/otclient/core/game.h +++ b/src/otclient/core/game.h @@ -55,6 +55,9 @@ public: bool isOnline() { return m_online; } + void setServerBeat(int serverBeat) { m_serverBeat = serverBeat; } + int getServerBeat() { return m_serverBeat; } + LocalPlayerPtr getLocalPlayer() { return m_localPlayer; } ProtocolGamePtr getProtocolGame() { return m_protocolGame; } @@ -62,6 +65,7 @@ private: LocalPlayerPtr m_localPlayer; ProtocolGamePtr m_protocolGame; bool m_online; + int m_serverBeat; }; extern Game g_game; diff --git a/src/otclient/net/protocolgameparse.cpp b/src/otclient/net/protocolgameparse.cpp index 01adce57..702bb764 100644 --- a/src/otclient/net/protocolgameparse.cpp +++ b/src/otclient/net/protocolgameparse.cpp @@ -269,6 +269,7 @@ void ProtocolGame::parsePlayerLogin(InputMessage& msg) m_localPlayer = LocalPlayerPtr(new LocalPlayer); m_localPlayer->setId(playerId); + g_game.setServerBeat(playerDrawSpeed); m_localPlayer->setDrawSpeed(playerDrawSpeed); m_localPlayer->setCanReportBugs(playerCanReportBugs); }