summaryrefslogtreecommitdiff
path: root/src/game-server/monstermanager.cpp
diff options
context:
space:
mode:
authorThorbjørn Lindeijer <thorbjorn@lindeijer.nl>2011-03-22 22:29:39 +0100
committerThorbjørn Lindeijer <thorbjorn@lindeijer.nl>2011-03-24 17:04:29 +0100
commit94d97450bc3a52cd90baa696320bd08d91ac301f (patch)
treefc2f5db6583040772aac1d39a14928bdfe7aa4eb /src/game-server/monstermanager.cpp
parent7967b82c19bfa5bd2249abcb807a7a55af031abe (diff)
downloadmanaserv-94d97450bc3a52cd90baa696320bd08d91ac301f.tar.gz
manaserv-94d97450bc3a52cd90baa696320bd08d91ac301f.tar.bz2
manaserv-94d97450bc3a52cd90baa696320bd08d91ac301f.tar.xz
manaserv-94d97450bc3a52cd90baa696320bd08d91ac301f.zip
Use a map to quickly find items and monsters by their name
Introduced a template class NameMap, which provides a nice API for mapping any custom types by their name. This change also makes any duplicate item or monster definitions be complete ignored, rather than being merged into the first definition. Reviewed-by: Philipp Sehmisch Reviewed-by: Yohann Ferreira
Diffstat (limited to 'src/game-server/monstermanager.cpp')
-rw-r--r--src/game-server/monstermanager.cpp48
1 files changed, 21 insertions, 27 deletions
diff --git a/src/game-server/monstermanager.cpp b/src/game-server/monstermanager.cpp
index a98126e0..5fb0b675 100644
--- a/src/game-server/monstermanager.cpp
+++ b/src/game-server/monstermanager.cpp
@@ -25,7 +25,6 @@
#include "game-server/itemmanager.h"
#include "game-server/monster.h"
#include "utils/logger.h"
-#include "utils/string.h"
#include "utils/xml.h"
#define MAX_MUTATION 99
@@ -86,28 +85,36 @@ void MonsterManager::reload()
continue;
int id = XML::getProperty(node, "id", 0);
- std::string name = XML::getProperty(node, "name", "unnamed");
+ std::string name = XML::getProperty(node, "name", std::string());
if (id < 1)
{
- LOG_WARN("Monster Manager: There is a monster ("
+ LOG_WARN("Monster Manager: Ignoring monster ("
<< name << ") without Id in "
<< mMonsterReferenceFile << "! It has been ignored.");
continue;
}
- MonsterClass *monster;
MonsterClasses::iterator i = mMonsterClasses.find(id);
- if (i == mMonsterClasses.end())
+ if (i != mMonsterClasses.end())
{
- monster = new MonsterClass(id);
- mMonsterClasses[id] = monster;
+ LOG_WARN("Monster Manager: Ignoring duplicate definition of "
+ "monster '" << id << "'!");
+ continue;
}
- else
+
+ MonsterClass *monster = new MonsterClass(id);
+ mMonsterClasses[id] = monster;
+
+ if (!name.empty())
{
- monster = i->second;
+ monster->setName(name);
+
+ if (mMonsterClassesByName.contains(name))
+ LOG_WARN("Monster Manager: Name not unique for monster " << id);
+ else
+ mMonsterClassesByName.insert(name, monster);
}
- monster->setName(name);
MonsterDrops drops;
bool attributesSet = false;
@@ -345,28 +352,15 @@ void MonsterManager::deinitialize()
delete i->second;
}
mMonsterClasses.clear();
+ mMonsterClassesByName.clear();
}
-MonsterClass *MonsterManager::getMonsterByName(std::string name) const
+MonsterClass *MonsterManager::getMonsterByName(const std::string &name) const
{
- // this function is not very fast but neither does it need to be
- // because it is only used by the @spawn command. It would be
- // possible to speed it up by caching the lowercase_name/MonsterClass
- // mapping in a std::map during MonsterManager::reload, should the
- // need arise.
- name = utils::toLower(name);
- for (MonsterClasses::const_iterator i = mMonsterClasses.begin(),
- i_end = mMonsterClasses.end(); i != i_end; ++i)
- {
- if(utils::toLower(i->second->getName()) == name)
- {
- return i->second;
- }
- }
- return 0;
+ return mMonsterClassesByName.find(name);
}
-MonsterClass *MonsterManager::getMonster(int id)
+MonsterClass *MonsterManager::getMonster(int id) const
{
MonsterClasses::const_iterator i = mMonsterClasses.find(id);
return i != mMonsterClasses.end() ? i->second : 0;