diff options
Diffstat (limited to 'src/beingmanager.cpp')
| -rw-r--r-- | src/beingmanager.cpp | 130 |
1 files changed, 116 insertions, 14 deletions
diff --git a/src/beingmanager.cpp b/src/beingmanager.cpp index 7f3d8845..e9d598c7 100644 --- a/src/beingmanager.cpp +++ b/src/beingmanager.cpp @@ -1,26 +1,24 @@ /* * The Mana World - * Copyright 2004 The Mana World Development Team + * Copyright (C) 2004 The Mana World Development Team * * This file is part of The Mana World. * - * The Mana World is free software; you can redistribute it and/or modify + * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * - * The Mana World is distributed in the hope that it will be useful, + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software + * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include <cassert> - #include "beingmanager.h" #include "localplayer.h" @@ -28,18 +26,31 @@ #include "npc.h" #include "player.h" +#ifdef EATHENA_SUPPORT +#include "net/messageout.h" +#include "net/ea/protocol.h" +#else #include "net/protocol.h" +#endif + #include "utils/dtor.h" +#include <cassert> + class FindBeingFunctor { public: bool operator() (Being *being) { Uint16 other_y = y + ((being->getType() == Being::NPC) ? 1 : 0); +#ifdef TMWSERV_SUPPORT const Vector &pos = being->getPosition(); return ((int) pos.x / 32 == x && ((int) pos.y / 32 == y || (int) pos.y / 32 == other_y) && +#else + return (being->mX == x && + (being->mY == y || being->mY == other_y) && +#endif being->mAction != Being::DEAD && (type == Being::UNKNOWN || being->getType() == type)); } @@ -48,6 +59,13 @@ class FindBeingFunctor Being::Type type; } beingFinder; +#ifdef EATHENA_SUPPORT +BeingManager::BeingManager(Network *network): + mNetwork(network) +{ +} +#endif + void BeingManager::setMap(Map *map) { mMap = map; @@ -61,10 +79,15 @@ void BeingManager::setPlayer(LocalPlayer *player) mBeings.push_back(player); } +#ifdef TMWSERV_SUPPORT Being* BeingManager::createBeing(int id, int type, int subtype) +#else +Being* BeingManager::createBeing(Uint32 id, Uint16 job) +#endif { Being *being; +#ifdef TMWSERV_SUPPORT switch (type) { case OBJECT_PLAYER: @@ -79,6 +102,24 @@ Being* BeingManager::createBeing(int id, int type, int subtype) default: assert(false); } +#else + if (job < 10) + being = new Player(id, job, mMap); + else if (job >= 50 && job < 1002) + being = new NPC(id, job, mMap, mNetwork); + else if (job >= 1002 && job < 1500) + being = new Monster(id, job, mMap); + else + being = new Being(id, job, mMap); + + // Player or NPC + if (job < 1002) + { + MessageOut outMsg(mNetwork); + outMsg.writeInt16(0x0094); + outMsg.writeInt32(id);//readLong(2)); + } +#endif mBeings.push_back(being); return being; @@ -87,12 +128,14 @@ Being* BeingManager::createBeing(int id, int type, int subtype) void BeingManager::destroyBeing(Being *being) { mBeings.remove(being); +#ifdef TMWSERV_SUPPORT if(being == player_node->getTarget()) player_node->setTarget(NULL); +#endif delete being; } -Being* BeingManager::findBeing(Uint16 id) +Being* BeingManager::findBeing(Uint32 id) { for (BeingIterator i = mBeings.begin(); i != mBeings.end(); i++) { @@ -123,9 +166,12 @@ Being* BeingManager::findBeingByPixel(Uint16 x, Uint16 y) for (; itr != itr_end; ++itr) { Being *being = (*itr); + int xtol = being->getWidth() / 2; int uptol = being->getHeight(); - if ((being != player_node) && + + if ((being->mAction != Being::DEAD) && + (being != player_node) && (being->getPixelX() - xtol <= x) && (being->getPixelX() + xtol >= x) && (being->getPixelY() - uptol <= y) && @@ -138,6 +184,19 @@ Being* BeingManager::findBeingByPixel(Uint16 x, Uint16 y) return NULL; } +Being* BeingManager::findBeingByName(std::string name, Being::Type type) +{ + for (BeingIterator i = mBeings.begin(); i != mBeings.end(); i++) + { + Being *being = (*i); + if (being->getName() == name + && (type == Being::UNKNOWN + || type == being->getType())) + return being; + } + return NULL; +} + Beings& BeingManager::getAll() { return mBeings; @@ -152,13 +211,15 @@ void BeingManager::logic() being->logic(); - /* +#ifdef EATHENA_SUPPORT if (being->mAction == Being::DEAD && being->mFrame >= 20) { delete being; i = mBeings.erase(i); } - else*/ { + else +#endif + { i++; } } @@ -186,6 +247,7 @@ Being* BeingManager::findNearestLivingBeing(Uint16 x, Uint16 y, int maxdist, Being *closestBeing = NULL; int dist = 0; +#ifdef TMWSERV_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 @@ -195,12 +257,20 @@ Being* BeingManager::findNearestLivingBeing(Uint16 x, Uint16 y, int maxdist, x = x * 32; y = y * 32; maxdist = maxdist * 32; +#endif - for (BeingIterator i = mBeings.begin(); i != mBeings.end(); i++) + BeingIterator itr = mBeings.begin(); + BeingIterator itr_end = mBeings.end(); + + for (; itr != itr_end; ++itr) { - Being *being = (*i); + Being *being = (*itr); +#ifdef TMWSERV_SUPPORT const Vector &pos = being->getPosition(); int d = abs(((int) pos.x) - x) + abs(((int) pos.y) - y); +#else + int d = abs(being->mX - x) + abs(being->mY - y); +#endif if ((being->getType() == type || type == Being::UNKNOWN) && (d < dist || closestBeing == NULL) // it is closer @@ -218,6 +288,38 @@ Being* BeingManager::findNearestLivingBeing(Uint16 x, Uint16 y, int maxdist, Being* BeingManager::findNearestLivingBeing(Being *aroundBeing, int maxdist, Being::Type type) { - const Vector &aroundBeingPos = aroundBeing->getPosition(); - return findNearestLivingBeing((int) aroundBeingPos.x,(int) aroundBeingPos.y,maxdist,type); + Being *closestBeing = NULL; + int dist = 0; +#ifdef TMWSERV_SUPPORT + const Vector &apos = aroundBeing->getPosition(); + int x = apos.x; + int y = apos.y; + maxdist = maxdist * 32; +#else + int x = aroundBeing->mX; + int y = aroundBeing->mY; +#endif + + for (BeingIterator i = mBeings.begin(); i != mBeings.end(); i++) + { + Being *being = (*i); +#ifdef TMWSERV_SUPPORT + const Vector &pos = being->getPosition(); + int d = abs(((int) pos.x) - x) + abs(((int) pos.y) - y); +#else + int d = abs(being->mX - x) + abs(being->mY - 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; } |