summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/actorspritemanager.cpp15
-rw-r--r--src/actorspritemanager.h2
-rw-r--r--src/game.cpp26
-rw-r--r--src/localplayer.cpp4
-rw-r--r--src/vector.h5
5 files changed, 24 insertions, 28 deletions
diff --git a/src/actorspritemanager.cpp b/src/actorspritemanager.cpp
index 2928aa45..683f346d 100644
--- a/src/actorspritemanager.cpp
+++ b/src/actorspritemanager.cpp
@@ -218,18 +218,23 @@ FloorItem *ActorSpriteManager::findItem(int id) const
return NULL;
}
-FloorItem *ActorSpriteManager::findItem(int x, int y) const
+FloorItem *ActorSpriteManager::findItem(int x, int y, int maxDist) const
{
+ FloorItem *item = 0;
+ int smallestDist = 0;
for_actors
{
- if ((*it)->getTileX() == x && (*it)->getTileY() == y &&
- (*it)->getType() == ActorSprite::FLOOR_ITEM)
+ int dist = std::max(std::abs((*it)->getTileX() - x),
+ std::abs((*it)->getTileY() - y));
+ if (((*it)->getType() == ActorSprite::FLOOR_ITEM) &&
+ ((!item && dist <= maxDist) || dist < smallestDist))
{
- return static_cast<FloorItem*>(*it);
+ item = static_cast<FloorItem*>(*it);
+ smallestDist = dist;
}
}
- return NULL;
+ return item;
}
Being *ActorSpriteManager::findBeingByName(const std::string &name,
diff --git a/src/actorspritemanager.h b/src/actorspritemanager.h
index 64703396..ee41ae6d 100644
--- a/src/actorspritemanager.h
+++ b/src/actorspritemanager.h
@@ -96,7 +96,7 @@ class ActorSpriteManager
/**
* Returns a FloorItem at specific coordinates.
*/
- FloorItem *findItem(int x, int y) const;
+ FloorItem *findItem(int x, int y, int maxDist = 0) const;
/**
* Returns a being nearest to specific coordinates.
diff --git a/src/game.cpp b/src/game.cpp
index 1c24d5d1..7eb2cef1 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -377,29 +377,11 @@ static void handleItemPickUp()
int y = local_player->getTileY();
// Let's look for items around until you find one.
- bool found = false;
- for (int xX = x - 1; xX < x + 2; ++xX)
- {
- for (int yY = y - 1; yY < y + 2; ++yY)
- {
- FloorItem *item = actorSpriteManager->findItem(xX, yY);
- if (item)
- {
- found = true;
- local_player->pickUp(item);
-
- // We found it, so set the player
- // direction accordingly,
- local_player->lookAt(
- local_player->getMap()->getTileCenter(xX, yY));
+ FloorItem *item = actorSpriteManager->findItem(x, y, 1);
+ if (!item)
+ return;
- // Get out of the loops
- break;
- }
- }
- if (found)
- break;
- }
+ local_player->pickUp(item);
}
/**
diff --git a/src/localplayer.cpp b/src/localplayer.cpp
index a0350ce8..612fdd82 100644
--- a/src/localplayer.cpp
+++ b/src/localplayer.cpp
@@ -605,6 +605,10 @@ void LocalPlayer::pickUp(FloorItem *item)
if (dx * dx + dy * dy < 4)
{
Net::getPlayerHandler()->pickUp(item);
+ // We found it, so set the player direction to it
+ // if the player does not move
+ if (getDestination() == getPosition())
+ lookAt(item->getPosition());
mPickUpTarget = NULL;
}
else
diff --git a/src/vector.h b/src/vector.h
index 3360c20b..c0457bd7 100644
--- a/src/vector.h
+++ b/src/vector.h
@@ -182,6 +182,11 @@ class Vector
float x, y, z;
};
+inline bool operator == (const Vector &a, const Vector &b)
+{
+ return a.x == b.x && a.y == b.y && a.z == b.z;
+}
+
/**
* Appends a string representation of a vector to the output stream.
*/