diff --git a/src/client/map.cpp b/src/client/map.cpp index c9b3a40a..e612d834 100644 --- a/src/client/map.cpp +++ b/src/client/map.cpp @@ -375,17 +375,19 @@ void Map::endGhostMode() g_painter->resetOpacity(); } -ItemVector Map::findItemsById(uint16 clientId, uint32 max) +std::map Map::findItemsById(uint16 clientId, uint32 max) { - ItemVector ret; + std::map ret; uint32 count = 0; for(uint8_t z = 0; z <= Otc::MAX_Z; ++z) { for(const auto& pair : m_tileBlocks[z]) { const TileBlock& block = pair.second; for(const TilePtr& tile : block.getTiles()) { + if(unlikely(!tile || tile->isEmpty())) + continue; for(const ItemPtr& item : tile->getItems()) { if(item->getId() == clientId) { - ret.push_back(item); + ret.insert(std::make_pair(tile->getPosition(), item)); if(++count >= max) break; } diff --git a/src/client/map.h b/src/client/map.h index 98ee7cef..67c08786 100644 --- a/src/client/map.h +++ b/src/client/map.h @@ -197,7 +197,7 @@ public: void beginGhostMode(float opacity); void endGhostMode(); - ItemVector findItemsById(uint16 clientId, uint32 max); + std::map findItemsById(uint16 clientId, uint32 max); // known creature related void addCreature(const CreaturePtr& creature); diff --git a/src/client/position.h b/src/client/position.h index 0e2cb1b3..fcf89a0a 100644 --- a/src/client/position.h +++ b/src/client/position.h @@ -189,6 +189,8 @@ public: bool isInRange(const Position& pos, int minXRange, int maxXRange, int minYRange, int maxYRange) const { return (pos.x >= x-minXRange && pos.x <= x+maxXRange && pos.y >= y-minYRange && pos.y <= y+maxYRange && pos.z == z); } + // operator less than for std::map + bool operator<(const Position& other) const { return x < other.x && y < other.y && z < other.z; } bool up(int n = 1) { int nz = z-n;