summaryrefslogtreecommitdiff
path: root/src/game-server/monstermanager.cpp
diff options
context:
space:
mode:
authorGuillaume Melquiond <guillaume.melquiond@gmail.com>2007-08-31 06:44:06 +0000
committerGuillaume Melquiond <guillaume.melquiond@gmail.com>2007-08-31 06:44:06 +0000
commit4b43c8653a267ff3ac7224805f4522a94be9fab7 (patch)
treeadd08caeb5778cef86fccf8272a8e86c29ee3aaf /src/game-server/monstermanager.cpp
parent9f930eb2a24dd811633a9f6f7eb3a36310ebc8d5 (diff)
downloadmanaserv-4b43c8653a267ff3ac7224805f4522a94be9fab7.tar.gz
manaserv-4b43c8653a267ff3ac7224805f4522a94be9fab7.tar.bz2
manaserv-4b43c8653a267ff3ac7224805f4522a94be9fab7.tar.xz
manaserv-4b43c8653a267ff3ac7224805f4522a94be9fab7.zip
Implemented "reload" remote command.
Diffstat (limited to 'src/game-server/monstermanager.cpp')
-rw-r--r--src/game-server/monstermanager.cpp38
1 files changed, 29 insertions, 9 deletions
diff --git a/src/game-server/monstermanager.cpp b/src/game-server/monstermanager.cpp
index 36ee1eef..31c00ad0 100644
--- a/src/game-server/monstermanager.cpp
+++ b/src/game-server/monstermanager.cpp
@@ -23,25 +23,34 @@
#include <map>
+#include "game-server/monstermanager.hpp"
+
#include "defines.h"
#include "resourcemanager.h"
#include "game-server/itemmanager.hpp"
#include "game-server/monster.hpp"
-#include "game-server/monstermanager.hpp"
#include "utils/logger.h"
#include "utils/xml.hpp"
typedef std::map< int, MonsterClass * > MonsterClasses;
static MonsterClasses monsterClasses; /**< Monster reference */
+static std::string monsterReferenceFile;
void MonsterManager::initialize(std::string const &file)
{
+ monsterReferenceFile = file;
+ reload();
+}
+
+void MonsterManager::reload()
+{
ResourceManager *resman = ResourceManager::getInstance();
int size;
- char *data = (char *)resman->loadFile(file, size);
+ char *data = (char *)resman->loadFile(monsterReferenceFile, size);
if (!data) {
- LOG_ERROR("Monster Manager: Could not find " << file << "!");
+ LOG_ERROR("Monster Manager: Could not find "
+ << monsterReferenceFile << "!");
free(data);
return;
}
@@ -52,14 +61,14 @@ void MonsterManager::initialize(std::string const &file)
if (!doc)
{
LOG_ERROR("Monster Manager: Error while parsing item database ("
- << file << ")!");
+ << monsterReferenceFile << ")!");
return;
}
xmlNodePtr node = xmlDocGetRootElement(doc);
if (!node || !xmlStrEqual(node->name, BAD_CAST "monsters"))
{
- LOG_ERROR("Monster Manager: " << file
+ LOG_ERROR("Monster Manager: " << monsterReferenceFile
<< " is not a valid database file!");
xmlFreeDoc(doc);
return;
@@ -79,10 +88,22 @@ void MonsterManager::initialize(std::string const &file)
if (id == 0)
{
LOG_WARN("Monster Manager: There is a monster without ID in "
- << file << "! It has been ignored.");
+ << monsterReferenceFile << "! It has been ignored.");
continue;
}
+ MonsterClass *monster;
+ MonsterClasses::iterator i = monsterClasses.find(id);
+ if (i == monsterClasses.end())
+ {
+ monster = new MonsterClass(id);
+ monsterClasses[id] = monster;
+ }
+ else
+ {
+ monster = i->second;
+ }
+
MonsterDrops drops;
for (xmlNodePtr subnode = node->xmlChildrenNode; subnode != NULL;
@@ -100,13 +121,12 @@ void MonsterManager::initialize(std::string const &file)
}
}
- MonsterClass *monster = new MonsterClass(id);
monster->setDrops(drops);
- monsterClasses[id] = monster;
++nbMonsters;
}
- LOG_INFO("Loaded " << nbMonsters << " monsters from " << file << '.');
+ LOG_INFO("Loaded " << nbMonsters << " monsters from "
+ << monsterReferenceFile << '.');
xmlFreeDoc(doc);
}