summaryrefslogtreecommitdiff
path: root/src/beingmanager.cpp
diff options
context:
space:
mode:
authorBjørn Lindeijer <bjorn@lindeijer.nl>2009-03-22 19:45:03 +0100
committerBjørn Lindeijer <bjorn@lindeijer.nl>2009-03-22 19:45:56 +0100
commit0c43d04b438d41c277ae80402d4b4888db1a0b64 (patch)
tree3aaeb75ecd1bcbe85decedab5f1fa426fe0411e3 /src/beingmanager.cpp
parenta7f5eaeb7f643658d356533a608f0f18d85b6d32 (diff)
parent401802c1d7a1b3d659bdc53a45d9a6292fc1121e (diff)
downloadmana-0c43d04b438d41c277ae80402d4b4888db1a0b64.tar.gz
mana-0c43d04b438d41c277ae80402d4b4888db1a0b64.tar.bz2
mana-0c43d04b438d41c277ae80402d4b4888db1a0b64.tar.xz
mana-0c43d04b438d41c277ae80402d4b4888db1a0b64.zip
Merged the tmwserv client with the eAthena client
This merge involved major changes on both sides, and as such took several weeks. Lots of things are expected to be broken now, however, we now have a single code base to improve and extend, which can be compiled to support either eAthena or tmwserv. In the coming months, the plan is to work towards a client that supports both eAthena and tmwserv, without needing to be recompiled. Conflicts: Everywhere!
Diffstat (limited to 'src/beingmanager.cpp')
-rw-r--r--src/beingmanager.cpp80
1 files changed, 74 insertions, 6 deletions
diff --git a/src/beingmanager.cpp b/src/beingmanager.cpp
index 3c8edf86..e9d598c7 100644
--- a/src/beingmanager.cpp
+++ b/src/beingmanager.cpp
@@ -26,8 +26,12 @@
#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"
@@ -39,8 +43,14 @@ class FindBeingFunctor
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));
}
@@ -49,10 +59,12 @@ class FindBeingFunctor
Being::Type type;
} beingFinder;
+#ifdef EATHENA_SUPPORT
BeingManager::BeingManager(Network *network):
mNetwork(network)
{
}
+#endif
void BeingManager::setMap(Map *map)
{
@@ -67,10 +79,30 @@ 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:
+ being = new Player(id, subtype, mMap);
+ break;
+ case OBJECT_NPC:
+ being = new NPC(id, subtype, mMap);
+ break;
+ case OBJECT_MONSTER:
+ being = new Monster(id, subtype, mMap);
+ break;
+ default:
+ assert(false);
+ }
+#else
if (job < 10)
being = new Player(id, job, mMap);
else if (job >= 50 && job < 1002)
@@ -87,15 +119,19 @@ Being* BeingManager::createBeing(Uint32 id, Uint16 job)
outMsg.writeInt16(0x0094);
outMsg.writeInt32(id);//readLong(2));
}
+#endif
mBeings.push_back(being);
-
return being;
}
void BeingManager::destroyBeing(Being *being)
{
mBeings.remove(being);
+#ifdef TMWSERV_SUPPORT
+ if(being == player_node->getTarget())
+ player_node->setTarget(NULL);
+#endif
delete being;
}
@@ -131,15 +167,15 @@ Being* BeingManager::findBeingByPixel(Uint16 x, Uint16 y)
{
Being *being = (*itr);
- int xtol = being->getWidth();
- int uptol = being->getHeight() / 2;
+ int xtol = being->getWidth() / 2;
+ int uptol = being->getHeight();
if ((being->mAction != Being::DEAD) &&
(being != player_node) &&
- (being->getPixelX() <= x) &&
+ (being->getPixelX() - xtol <= x) &&
(being->getPixelX() + xtol >= x) &&
(being->getPixelY() - uptol <= y) &&
- (being->getPixelY() + uptol >= y))
+ (being->getPixelY() >= y))
{
return being;
}
@@ -175,12 +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++;
}
}
@@ -208,13 +247,30 @@ 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
+ //
+ //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
+
BeingIterator itr = mBeings.begin();
BeingIterator itr_end = mBeings.end();
for (; itr != itr_end; ++itr)
{
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
@@ -234,13 +290,25 @@ Being* BeingManager::findNearestLivingBeing(Being *aroundBeing, int maxdist,
{
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