diff --git a/zone/mob.cpp b/zone/mob.cpp index b0d575b85..7674c4d72 100644 --- a/zone/mob.cpp +++ b/zone/mob.cpp @@ -6283,37 +6283,44 @@ void Mob::ClearSpecialAbilities() { void Mob::ProcessSpecialAbilities(const std::string &str) { ClearSpecialAbilities(); - std::vector sp = Strings::Split(str, '^'); - for(auto iter = sp.begin(); iter != sp.end(); ++iter) { - std::vector sub_sp = Strings::Split((*iter), ','); - if(sub_sp.size() >= 2) { - int ability = std::stoi(sub_sp[0]); + const auto& sp = Strings::Split(str, '^'); + for (const auto& s : sp) { + const auto& sub_sp = Strings::Split(s, ','); + if ( + sub_sp.size() >= 2 && + Strings::IsNumber(sub_sp[0]) && + Strings::IsNumber(sub_sp[1]) + ) { + int ability_id = std::stoi(sub_sp[0]); int value = std::stoi(sub_sp[1]); - SetSpecialAbility(ability, value); - switch(ability) { - case SPECATK_QUAD: - if(value > 0) { - SetSpecialAbility(SPECATK_TRIPLE, 1); - } - break; - case DESTRUCTIBLE_OBJECT: - if(value == 0) { - SetDestructibleObject(false); - } else { - SetDestructibleObject(true); - } - break; - default: - break; + SetSpecialAbility(ability_id, value); + + switch (ability_id) { + case SPECATK_QUAD: + if (value > 0) { + SetSpecialAbility(SPECATK_TRIPLE, 1); + } + break; + case DESTRUCTIBLE_OBJECT: + if (value == 0) { + SetDestructibleObject(false); + } else { + SetDestructibleObject(true); + } + break; + default: + break; } - for(size_t i = 2, p = 0; i < sub_sp.size(); ++i, ++p) { - if(p >= MAX_SPECIAL_ATTACK_PARAMS) { + for (size_t i = 2, param_id = 0; i < sub_sp.size(); ++i, ++param_id) { + if (param_id >= MAX_SPECIAL_ATTACK_PARAMS) { break; } - SetSpecialAbilityParam(ability, p, std::stoi(sub_sp[i])); + if (Strings::IsNumber(sub_sp[i])) { + SetSpecialAbilityParam(ability_id, param_id, std::stoi(sub_sp[i])); + } } } }