diff options
author | Yohann Ferreira <yohann_dot_ferreira_at_orange_dot_efer> | 2010-10-22 13:09:25 +0200 |
---|---|---|
committer | Yohann Ferreira <yohann_dot_ferreira_at_orange_dot_efer> | 2010-10-22 13:16:30 +0200 |
commit | bf6e38872829f87ff408f294184da14c8c24bfd4 (patch) | |
tree | f569a61013932b0988e90e83dbc553e93457639a /src/game-server/monstermanager.cpp | |
parent | 05130de24bf68d6ca427cbc126a03159ca777e5d (diff) | |
download | manaserv-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.cpp | 37 |
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")) |