From 13789c56128a694b3236717359cfb2cc04f627e0 Mon Sep 17 00:00:00 2001 From: Marcin Michalski Date: Thu, 28 Jan 2016 16:35:08 +0100 Subject: [PATCH] Properly check tile elevation in older protocols --- src/client/game.cpp | 6 ++++++ src/client/localplayer.cpp | 3 +++ src/client/tile.cpp | 16 +++++++++------- src/client/tile.h | 1 + 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/client/game.cpp b/src/client/game.cpp index 4ddc3145..86e59c67 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -654,6 +654,12 @@ bool Game::walk(Otc::Direction direction, bool dash) m_localPlayer->stopAutoWalk(); + if(getClientVersion() <= 740) { + const TilePtr& fromTile = g_map.getTile(m_localPlayer->getPosition()); + if (fromTile && toTile && (toTile->getElevation() - 1 > fromTile->getElevation())) + return false; + } + g_lua.callGlobalField("g_game", "onWalk", direction, dash); forceWalk(direction); diff --git a/src/client/localplayer.cpp b/src/client/localplayer.cpp index 05dfd782..4930143b 100644 --- a/src/client/localplayer.cpp +++ b/src/client/localplayer.cpp @@ -166,6 +166,9 @@ void LocalPlayer::cancelWalk(Otc::Direction direction) bool LocalPlayer::autoWalk(const Position& destination) { + if(g_game.getClientVersion() <= 740 && m_position.isInRange(destination, 1, 1)) + return g_game.walk(m_position.getDirectionFromPosition(destination)); + bool tryKnownPath = false; if(destination != m_autoWalkDestination) { m_knownCompletePath = false; diff --git a/src/client/tile.cpp b/src/client/tile.cpp index 51117f94..59a161dd 100644 --- a/src/client/tile.cpp +++ b/src/client/tile.cpp @@ -509,9 +509,6 @@ bool Tile::isWalkable(bool ignoreCreatures) if(!getGround()) return false; - if(g_game.getClientVersion() <= 740 && hasElevation(2)) - return false; - for(const ThingPtr& thing : m_things) { if(thing->isNotWalkable()) return false; @@ -636,13 +633,18 @@ bool Tile::canErase() return m_walkingCreatures.empty() && m_effects.empty() && m_things.empty() && m_flags == 0 && m_minimapColor == 0; } -bool Tile::hasElevation(int elevation) +int Tile::getElevation() const { - int count = 0; + int elevation = 0; for(const ThingPtr& thing : m_things) if(thing->getElevation() > 0) - count++; - return count >= elevation; + elevation++; + return elevation; +} + +bool Tile::hasElevation(int elevation) +{ + return getElevation() >= elevation; } void Tile::checkTranslucentLight() diff --git a/src/client/tile.h b/src/client/tile.h index 7e8dc849..4ee87467 100644 --- a/src/client/tile.h +++ b/src/client/tile.h @@ -109,6 +109,7 @@ public: bool hasCreature(); bool limitsFloorsView(bool isFreeView = false); bool canErase(); + int getElevation() const; bool hasElevation(int elevation = 1); void overwriteMinimapColor(uint8 color) { m_minimapColor = color; }