diff options
author | Thorbjørn Lindeijer <thorbjorn@lindeijer.nl> | 2010-01-18 09:14:36 +0100 |
---|---|---|
committer | Thorbjørn Lindeijer <thorbjorn@lindeijer.nl> | 2010-01-18 09:14:36 +0100 |
commit | b823889f1747bbceb61273f7a7383580c4b034e3 (patch) | |
tree | e86c37728c0fdd991ed18f101092c07b03b7e918 | |
parent | 6eb2e01ef6943e4f8ef7cc32ec325e3c22b1f5ec (diff) | |
download | mana-client-b823889f1747bbceb61273f7a7383580c4b034e3.tar.gz mana-client-b823889f1747bbceb61273f7a7383580c4b034e3.tar.bz2 mana-client-b823889f1747bbceb61273f7a7383580c4b034e3.tar.xz mana-client-b823889f1747bbceb61273f7a7383580c4b034e3.zip |
Unified BeingManager::findNearestLivingBeing for eAthena and manaserv
It now always works with pixels.
-rw-r--r-- | src/beingmanager.cpp | 63 | ||||
-rw-r--r-- | src/beingmanager.h | 32 | ||||
-rw-r--r-- | src/game.cpp | 9 | ||||
-rw-r--r-- | src/gui/viewport.cpp | 21 |
4 files changed, 38 insertions, 87 deletions
diff --git a/src/beingmanager.cpp b/src/beingmanager.cpp index 8bd951fa..cc3d68e5 100644 --- a/src/beingmanager.cpp +++ b/src/beingmanager.cpp @@ -206,23 +206,14 @@ void BeingManager::clear() mBeings.push_back(player_node); } -Being *BeingManager::findNearestLivingBeing(int x, int y, int maxdist, +Being *BeingManager::findNearestLivingBeing(int x, int y, + int maxTileDist, Being::Type type) const { - Being *closestBeing = NULL; + Being *closestBeing = 0; int dist = 0; -#ifdef MANASERV_SUPPORT - //Why do we do this: - //For some reason x,y passed to this function is always - //in map coords, while down below its in pixels - // - //I believe there is a deeper problem under this, but - //for a temp solution we'll convert to coords to pixels - x = x * 32; - y = y * 32; - maxdist = maxdist * 32; -#endif + const int maxDist = maxTileDist * 32; Beings::const_iterator itr = mBeings.begin(); Beings::const_iterator itr_end = mBeings.end(); @@ -230,15 +221,11 @@ Being *BeingManager::findNearestLivingBeing(int x, int y, int maxdist, for (; itr != itr_end; ++itr) { Being *being = (*itr); -#ifdef MANASERV_SUPPORT const Vector &pos = being->getPosition(); int d = abs(((int) pos.x) - x) + abs(((int) pos.y) - y); -#else - int d = abs(being->getTileX() - x) + abs(being->getTileY() - y); -#endif if ((being->getType() == type || type == Being::UNKNOWN) - && (d < dist || closestBeing == NULL) // it is closer + && (d < dist || !closestBeing) // it is closer && being->mAction != Being::DEAD) // no dead beings { dist = d; @@ -246,46 +233,14 @@ Being *BeingManager::findNearestLivingBeing(int x, int y, int maxdist, } } - return (maxdist >= dist) ? closestBeing : NULL; + return (maxDist >= dist) ? closestBeing : 0; } -Being *BeingManager::findNearestLivingBeing(Being *aroundBeing, int maxdist, +Being *BeingManager::findNearestLivingBeing(Being *aroundBeing, int maxDist, Being::Type type) const { - Being *closestBeing = NULL; - int dist = 0; -#ifdef MANASERV_SUPPORT - const Vector &apos = aroundBeing->getPosition(); - int x = apos.x; - int y = apos.y; - maxdist = maxdist * 32; -#else - int x = aroundBeing->getTileX(); - int y = aroundBeing->getTileY(); -#endif - - for (Beings::const_iterator i = mBeings.begin(), i_end = mBeings.end(); - i != i_end; ++i) - { - Being *being = (*i); -#ifdef MANASERV_SUPPORT - const Vector &pos = being->getPosition(); - int d = abs(((int) pos.x) - x) + abs(((int) pos.y) - y); -#else - int d = abs(being->getTileX() - x) + abs(being->getTileY() - y); -#endif - - if ((being->getType() == type || type == Being::UNKNOWN) - && (d < dist || closestBeing == NULL) // it is closer - && being->mAction != Being::DEAD // no dead beings - && being != aroundBeing) - { - dist = d; - closestBeing = being; - } - } - - return (maxdist >= dist) ? closestBeing : NULL; + const Vector &pos = aroundBeing->getPosition(); + return findNearestLivingBeing(pos.x, pos.y, maxDist, type); } bool BeingManager::hasBeing(Being *being) const diff --git a/src/beingmanager.h b/src/beingmanager.h index bea84e25..b288cc26 100644 --- a/src/beingmanager.h +++ b/src/beingmanager.h @@ -70,30 +70,32 @@ class BeingManager /** * Returns a being nearest to specific coordinates. * - * @param x X coordinate. - * @param y Y coordinate. - * @param maxdist Maximal distance. If minimal distance is larger, - * no being is returned. - * @param type The type of being to look for. + * @param x X coordinate in pixels. + * @param y Y coordinate in pixels. + * @param maxTileDist Maximal distance in tiles. If minimal distance is + * larger, no being is returned. + * @param type The type of being to look for. */ - Being *findNearestLivingBeing(int x, int y, int maxdist, + Being *findNearestLivingBeing(int x, int y, int maxTileDist, Being::Type type = Being::UNKNOWN) const; + /** + * Returns a being nearest to another being. + * + * @param aroundBeing The being to search around. + * @param maxTileDist Maximal distance in tiles. If minimal distance is + * larger, no being is returned. + * @param type The type of being to look for. + */ + Being *findNearestLivingBeing(Being *aroundBeing, int maxTileDist, + Being::Type type = Being::UNKNOWN) const; + /** * Finds a being by name and (optionally) by type. */ Being *findBeingByName(const std::string &name, Being::Type type = Being::UNKNOWN) const; - /** - * Returns a being nearest to another being. - * - * \param maxdist maximal distance. If minimal distance is larger, - * no being is returned - */ - Being *findNearestLivingBeing(Being *aroundBeing, int maxdist, - Being::Type type = Being::UNKNOWN) const; - /** * Returns the whole list of beings. */ diff --git a/src/game.cpp b/src/game.cpp index c8f976a2..9ca58461 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -980,19 +980,14 @@ void Game::handleInput() if (keyboard.isKeyActive(keyboard.KEY_TARGET_ATTACK)) { - Being *target = NULL; + Being *target = 0; bool newTarget = !keyboard.isKeyActive(keyboard.KEY_TARGET); // A set target has highest priority if (!player_node->getTarget()) { -#ifdef MANASERV_SUPPORT - Uint16 targetX = x / 32, targetY = y / 32; -#else - Uint16 targetX = x, targetY = y; -#endif // Only auto target Monsters - target = beingManager->findNearestLivingBeing(targetX, targetY, + target = beingManager->findNearestLivingBeing(player_node, 20, Being::MONSTER); } player_node->attack(target, newTarget); diff --git a/src/gui/viewport.cpp b/src/gui/viewport.cpp index ec8cf341..db995ab0 100644 --- a/src/gui/viewport.cpp +++ b/src/gui/viewport.cpp @@ -307,10 +307,10 @@ void Viewport::mousePressed(gcn::MouseEvent &event) mPlayerFollowMouse = false; - const int pixelx = event.getX() + (int) mPixelViewX; - const int pixely = event.getY() + (int) mPixelViewY; - const int tilex = pixelx / mMap->getTileWidth(); - const int tiley = pixely / mMap->getTileHeight(); + const int pixelX = event.getX() + (int) mPixelViewX; + const int pixelY = event.getY() + (int) mPixelViewY; + const int tileX = pixelX / mMap->getTileWidth(); + const int tileY = pixelY / mMap->getTileHeight(); // Right click might open a popup if (event.getButton() == gcn::MouseEvent::RIGHT) @@ -318,14 +318,14 @@ void Viewport::mousePressed(gcn::MouseEvent &event) Being *being; FloorItem *floorItem; - if ((being = beingManager->findBeingByPixel(pixelx, pixely)) && + if ((being = beingManager->findBeingByPixel(pixelX, pixelY)) && being != player_node) { mPopupMenu->showPopup(event.getX(), event.getY(), being); return; } - else if ((floorItem = floorItemManager->findByCoordinates(tilex, - tiley))) + else if ((floorItem = floorItemManager->findByCoordinates(tileX, + tileY))) { mPopupMenu->showPopup(event.getX(), event.getY(), floorItem); return; @@ -346,7 +346,7 @@ void Viewport::mousePressed(gcn::MouseEvent &event) Being *being; // Interact with some being - if ((being = beingManager->findBeingByPixel(pixelx, pixely))) + if ((being = beingManager->findBeingByPixel(pixelX, pixelY))) { switch (being->getType()) { @@ -378,7 +378,7 @@ void Viewport::mousePressed(gcn::MouseEvent &event) } // Picks up a item if we clicked on one } - else if ((item = floorItemManager->findByCoordinates(tilex, tiley))) + else if ((item = floorItemManager->findByCoordinates(tileX, tileY))) { player_node->pickUp(item); } @@ -401,8 +401,7 @@ void Viewport::mousePressed(gcn::MouseEvent &event) { // Find the being nearest to the clicked position Being *target = beingManager->findNearestLivingBeing( - tilex, tiley, - 20, Being::MONSTER); + pixelX, pixelY, 20, Being::MONSTER); if (target) player_node->setTarget(target); |