diff options
-rw-r--r-- | src/gui/viewport.cpp | 74 | ||||
-rw-r--r-- | src/resources/map/map.h | 3 |
2 files changed, 67 insertions, 10 deletions
diff --git a/src/gui/viewport.cpp b/src/gui/viewport.cpp index e476e4b38..672708394 100644 --- a/src/gui/viewport.cpp +++ b/src/gui/viewport.cpp @@ -623,8 +623,15 @@ void Viewport::getMouseTile(const int x, const int y, const int tileViewY = mPixelViewY / th; for (int f = tileViewY; f < tileViewY + heightTiles; f ++) { - if (!mMap->getWalk(destX, f)) + if (!mMap->getWalk(destX, + f, + BlockMask::WALL | + BlockMask::AIR | + BlockMask::WATER | + BlockMask::PLAYERWALL)) + { continue; + } const int offset = mMap->getHeightOffset( destX, f) * th2; @@ -697,7 +704,12 @@ void Viewport::walkByMouse(const MouseEvent &event) else if (y < 0) dy = -1; - if (mMap->getWalk(playerX + dx, playerY + dy)) + if (mMap->getWalk(playerX + dx, + playerY + dy, + BlockMask::WALL | + BlockMask::AIR | + BlockMask::WATER | + BlockMask::PLAYERWALL)) { localPlayer->navigateTo(playerX + dx, playerY + dy); } @@ -708,17 +720,35 @@ void Viewport::walkByMouse(const MouseEvent &event) // try avoid diagonal collision if (x2 > y2) { - if (mMap->getWalk(playerX + dx, playerY)) + if (mMap->getWalk(playerX + dx, + playerY, + BlockMask::WALL | + BlockMask::AIR | + BlockMask::WATER | + BlockMask::PLAYERWALL)) + { dy = 0; + } else + { dx = 0; + } } else { - if (mMap->getWalk(playerX, playerY + dy)) + if (mMap->getWalk(playerX, + playerY + dy, + BlockMask::WALL | + BlockMask::AIR | + BlockMask::WATER | + BlockMask::PLAYERWALL)) + { dx = 0; + } else + { dy = 0; + } } } else @@ -726,17 +756,45 @@ void Viewport::walkByMouse(const MouseEvent &event) // try avoid vertical or horisontal collision if (!dx) { - if (mMap->getWalk(playerX + 1, playerY + dy)) + if (mMap->getWalk(playerX + 1, + playerY + dy, + BlockMask::WALL | + BlockMask::AIR | + BlockMask::WATER | + BlockMask::PLAYERWALL)) + { dx = 1; - if (mMap->getWalk(playerX - 1, playerY + dy)) + } + if (mMap->getWalk(playerX - 1, + playerY + dy, + BlockMask::WALL | + BlockMask::AIR | + BlockMask::WATER | + BlockMask::PLAYERWALL)) + { dx = -1; + } } if (!dy) { - if (mMap->getWalk(playerX + dx, playerY + 1)) + if (mMap->getWalk(playerX + dx, + playerY + 1, + BlockMask::WALL | + BlockMask::AIR | + BlockMask::WATER | + BlockMask::PLAYERWALL)) + { dy = 1; - if (mMap->getWalk(playerX + dx, playerY - 1)) + } + if (mMap->getWalk(playerX + dx, + playerY - 1, + BlockMask::WALL | + BlockMask::AIR | + BlockMask::WATER | + BlockMask::PLAYERWALL)) + { dy = -1; + } } } localPlayer->navigateTo(playerX + dx, playerY + dy); diff --git a/src/resources/map/map.h b/src/resources/map/map.h index 8f7b6dbab..d6c957df9 100644 --- a/src/resources/map/map.h +++ b/src/resources/map/map.h @@ -164,8 +164,7 @@ class Map final : public Properties, * without walkmask, only blocks against colliding tiles. */ bool getWalk(const int x, const int y, - const unsigned char blockWalkMask = BlockMask::WALL - | BlockMask::AIR | BlockMask::WATER) const + const unsigned char blockWalkMask) const restrict2 A_WARN_UNUSED; void setWalk(const int x, const int y) restrict2; |