summaryrefslogtreecommitdiff
path: root/src/beingmanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/beingmanager.cpp')
-rw-r--r--src/beingmanager.cpp130
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;
}