mirror of
https://github.com/edubart/otclient.git
synced 2025-12-21 07:57:12 +01:00
Implement dash walking and zoom out again
This commit is contained in:
@@ -613,6 +613,70 @@ bool Game::walk(Otc::Direction direction)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Game::dashWalk(Otc::Direction direction)
|
||||
{
|
||||
if(!canPerformGameAction())
|
||||
return false;
|
||||
|
||||
// must cancel follow before any new walk
|
||||
if(isFollowing())
|
||||
cancelFollow();
|
||||
|
||||
// must cancel auto walking
|
||||
if(m_localPlayer->isAutoWalking()) {
|
||||
m_protocolGame->sendStop();
|
||||
m_localPlayer->stopAutoWalk();
|
||||
}
|
||||
|
||||
if(m_localPlayer->isWalking() && m_dashTimer.ticksElapsed() < std::max<int>(m_localPlayer->getStepDuration(false, direction) - m_ping, 30))
|
||||
return false;
|
||||
|
||||
Position toPos = m_localPlayer->getPosition().translatedToDirection(direction);
|
||||
TilePtr toTile = g_map.getTile(toPos);
|
||||
// only do prewalks to walkable tiles (like grounds and not walls)
|
||||
if(toTile && toTile->isWalkable()) {
|
||||
if(!m_localPlayer->isWalking() && m_localPlayer->getWalkTicksElapsed() >= m_localPlayer->getStepDuration() + 100)
|
||||
m_localPlayer->preWalk(direction);
|
||||
// check walk to another floor (e.g: when above 3 parcels)
|
||||
} else {
|
||||
// check if can walk to a lower floor
|
||||
auto canChangeFloorDown = [&]() -> bool {
|
||||
Position pos = toPos;
|
||||
if(!pos.down())
|
||||
return false;
|
||||
TilePtr toTile = g_map.getTile(pos);
|
||||
if(toTile && toTile->hasElevation(3))
|
||||
return true;
|
||||
return false;
|
||||
};
|
||||
|
||||
// check if can walk to a higher floor
|
||||
auto canChangeFloorUp = [&]() -> bool {
|
||||
TilePtr fromTile = m_localPlayer->getTile();
|
||||
if(!fromTile || !fromTile->hasElevation(3))
|
||||
return false;
|
||||
Position pos = toPos;
|
||||
if(!pos.up())
|
||||
return false;
|
||||
TilePtr toTile = g_map.getTile(pos);
|
||||
if(!toTile || !toTile->isWalkable())
|
||||
return false;
|
||||
return true;
|
||||
};
|
||||
|
||||
if(canChangeFloorDown() || canChangeFloorUp() ||
|
||||
(!toTile || toTile->isEmpty())) {
|
||||
m_localPlayer->lockWalk();
|
||||
} else
|
||||
return false;
|
||||
}
|
||||
|
||||
forceWalk(direction);
|
||||
m_dashTimer.restart();
|
||||
m_lastWalkDir = direction;
|
||||
return true;
|
||||
}
|
||||
|
||||
void Game::autoWalk(std::vector<Otc::Direction> dirs)
|
||||
{
|
||||
if(!canPerformGameAction())
|
||||
|
||||
Reference in New Issue
Block a user