summaryrefslogtreecommitdiff
path: root/src/game-server/monstermanager.cpp
diff options
context:
space:
mode:
authorYohann Ferreira <yohann_dot_ferreira_at_orange_dot_efer>2010-10-22 13:09:25 +0200
committerYohann Ferreira <yohann_dot_ferreira_at_orange_dot_efer>2010-10-22 13:16:30 +0200
commitbf6e38872829f87ff408f294184da14c8c24bfd4 (patch)
treef569a61013932b0988e90e83dbc553e93457639a /src/game-server/monstermanager.cpp
parent05130de24bf68d6ca427cbc126a03159ca777e5d (diff)
downloadmanaserv-bf6e38872829f87ff408f294184da14c8c24bfd4.tar.gz
manaserv-bf6e38872829f87ff408f294184da14c8c24bfd4.tar.bz2
manaserv-bf6e38872829f87ff408f294184da14c8c24bfd4.tar.xz
manaserv-bf6e38872829f87ff408f294184da14c8c24bfd4.zip
Made the servers check for positive id in xml db loading.
Also fixed a memleak when loading an invalid monster attack. Resolves: Mana-Mantis #215. Reviewed-by: Thorbjorn.
Diffstat (limited to 'src/game-server/monstermanager.cpp')
-rw-r--r--src/game-server/monstermanager.cpp37
1 files changed, 29 insertions, 8 deletions
diff --git a/src/game-server/monstermanager.cpp b/src/game-server/monstermanager.cpp
index f59799c3..1444e17b 100644
--- a/src/game-server/monstermanager.cpp
+++ b/src/game-server/monstermanager.cpp
@@ -79,10 +79,10 @@ void MonsterManager::reload()
if (!xmlStrEqual(node->name, BAD_CAST "monster"))
continue;
- int id = XML::getProperty(node, "id", -1);
+ int id = XML::getProperty(node, "id", 0);
std::string name = XML::getProperty(node, "name", "unnamed");
- if (id == -1)
+ if (id < 1)
{
LOG_WARN("Monster Manager: There is a monster ("
<< name << ") without ID in "
@@ -210,19 +210,32 @@ void MonsterManager::reload()
std::string sElement = XML::getProperty(subnode, "element", "neutral");
att->element = elementFromString(sElement);
std::string sType = XML::getProperty(subnode, "type", "physical");
- if (sType == "physical") {att->type = DAMAGE_PHYSICAL; }
- else if (sType == "magical" || sType == "magic") {att->type = DAMAGE_MAGICAL; }
- else if (sType == "other") {att->type = DAMAGE_OTHER; }
- else {
+
+ bool validMonsterAttack = true;
+ if (sType == "physical")
+ {
+ att->type = DAMAGE_PHYSICAL;
+ }
+ else if (sType == "magical" || sType == "magic")
+ {
+ att->type = DAMAGE_MAGICAL;
+ }
+ else if (sType == "other")
+ {
+ att->type = DAMAGE_OTHER;
+ }
+ else
+ {
LOG_WARN("Monster manager " << mMonsterReferenceFile
<< ": unknown damage type '" << sType << "'.");
}
- if (att->id == 0)
+ if (att->id < 1)
{
LOG_WARN(mMonsterReferenceFile
<< ": Attack without ID for monster #"
<< id << " (" << name << ") - attack ignored");
+ validMonsterAttack = false;
}
else if (att->element == ELEMENT_ILLEGAL)
{
@@ -230,17 +243,25 @@ void MonsterManager::reload()
<< ": Attack with unknown element \""
<< sElement << "\" for monster #" << id
<< " (" << name << ") - attack ignored");
+ validMonsterAttack = false;
}
else if (att->type == -1)
{
LOG_WARN(mMonsterReferenceFile
<< ": Attack with unknown type \"" << sType << "\""
<< " for monster #" << id << " (" << name << ")");
+ validMonsterAttack = false;
}
- else
+
+ if (validMonsterAttack)
{
monster->addAttack(att);
}
+ else
+ {
+ delete att;
+ att = 0;
+ }
}
else if (xmlStrEqual(subnode->name, BAD_CAST "script"))