diff --git a/zone/common.h b/zone/common.h index c400c5f56..758dd1cc4 100644 --- a/zone/common.h +++ b/zone/common.h @@ -121,7 +121,8 @@ enum { LEASH = 32, TETHER = 33, DESTRUCTIBLE_OBJECT = 34, - NO_HARM_FROM_CLIENT = 35 + NO_HARM_FROM_CLIENT = 35, + MAX_SPECIAL_ATTACK = 36 }; typedef enum { //fear states diff --git a/zone/mob.cpp b/zone/mob.cpp index 49e72c8c2..6f41e698f 100644 --- a/zone/mob.cpp +++ b/zone/mob.cpp @@ -393,8 +393,6 @@ Mob::~Mob() SetPet(0); } - ClearSpecialAbilities(); - EQApplicationPacket app; CreateDespawnPacket(&app, !IsCorpse()); Corpse* corpse = entity_list.GetCorpseByID(GetID()); @@ -4879,111 +4877,74 @@ bool Mob::HasSpellEffect(int effectid) } int Mob::GetSpecialAbility(int ability) { - if (SpecialAbilities.count(ability)) - return SpecialAbilities.at(ability).level; - return 0; -} - -int Mob::GetSpecialAbilityParam(int ability, int param) { - if(param >= MAX_SPECIAL_ATTACK_PARAMS || param < 0) { + if(ability >= MAX_SPECIAL_ATTACK || ability < 0) { return 0; } - auto iter = SpecialAbilities.find(ability); - if(iter != SpecialAbilities.end()) { - return iter->second.params[param]; + return SpecialAbilities[ability].level; +} + +int Mob::GetSpecialAbilityParam(int ability, int param) { + if(param >= MAX_SPECIAL_ATTACK_PARAMS || param < 0 || ability >= MAX_SPECIAL_ATTACK || ability < 0) { + return 0; } - return 0; + return SpecialAbilities[ability].params[param]; } void Mob::SetSpecialAbility(int ability, int level) { - auto iter = SpecialAbilities.find(ability); - if(iter != SpecialAbilities.end()) { - SpecialAbility spec = iter->second; - spec.level = level; - SpecialAbilities[ability] = spec; - } else { - SpecialAbility spec; - memset(&spec, 0, sizeof spec); - spec.level = level; - spec.timer = nullptr; - SpecialAbilities[ability] = spec; - } -} - -void Mob::SetSpecialAbilityParam(int ability, int param, int value) { - if(param >= MAX_SPECIAL_ATTACK_PARAMS || param < 0) { + if(ability >= MAX_SPECIAL_ATTACK || ability < 0) { return; } - auto iter = SpecialAbilities.find(ability); - if(iter != SpecialAbilities.end()) { - SpecialAbility spec = iter->second; - spec.params[param] = value; - SpecialAbilities[ability] = spec; - } else { - SpecialAbility spec; - memset(&spec, 0, sizeof spec); - spec.params[param] = value; - spec.timer = nullptr; - SpecialAbilities[ability] = spec; + SpecialAbilities[ability].level = level; +} + +void Mob::SetSpecialAbilityParam(int ability, int param, int value) { + if(param >= MAX_SPECIAL_ATTACK_PARAMS || param < 0 || ability >= MAX_SPECIAL_ATTACK || ability < 0) { + return; } + + SpecialAbilities[ability].params[param] = value; } void Mob::StartSpecialAbilityTimer(int ability, uint32 time) { - auto iter = SpecialAbilities.find(ability); - if(iter != SpecialAbilities.end()) { - SpecialAbility spec = iter->second; - if(spec.timer) { - spec.timer->Start(time); - } else { - spec.timer = new Timer(time); - spec.timer->Start(); - } + if (ability >= MAX_SPECIAL_ATTACK || ability < 0) { + return; + } - SpecialAbilities[ability] = spec; + if(SpecialAbilities[ability].timer) { + SpecialAbilities[ability].timer->Start(time); } else { - SpecialAbility spec; - memset(&spec, 0, sizeof spec); - spec.timer = new Timer(time); - spec.timer->Start(); - SpecialAbilities[ability] = spec; + SpecialAbilities[ability].timer = new Timer(time); + SpecialAbilities[ability].timer->Start(); } } void Mob::StopSpecialAbilityTimer(int ability) { - auto iter = SpecialAbilities.find(ability); - if(iter != SpecialAbilities.end()) { - SpecialAbility spec = iter->second; - if(spec.timer) { - delete spec.timer; - spec.timer = nullptr; - } - - SpecialAbilities[ability] = spec; + if (ability >= MAX_SPECIAL_ATTACK || ability < 0) { + return; } + + safe_delete(SpecialAbilities[ability].timer); } Timer *Mob::GetSpecialAbilityTimer(int ability) { - auto iter = SpecialAbilities.find(ability); - if(iter != SpecialAbilities.end()) { - return iter->second.timer; + if (ability >= MAX_SPECIAL_ATTACK || ability < 0) { + return nullptr; } - return nullptr; + return SpecialAbilities[ability].timer; } void Mob::ClearSpecialAbilities() { - auto iter = SpecialAbilities.begin(); - while(iter != SpecialAbilities.end()) { - if(iter->second.timer) { - delete iter->second.timer; + for(int a = 0; a < MAX_SPECIAL_ATTACK; ++a) { + SpecialAbilities[a].level = 0; + safe_delete(SpecialAbilities[a].timer); + for(int p = 0; p < MAX_SPECIAL_ATTACK_PARAMS; ++p) { + SpecialAbilities[a].params[p] = 0; } - ++iter; } - - SpecialAbilities.clear(); } void Mob::ProcessSpecialAbilities(const std::string str) { diff --git a/zone/mob.h b/zone/mob.h index a0ad73578..9fb518f65 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -40,6 +40,18 @@ public: enum eStandingPetOrder { SPO_Follow, SPO_Sit, SPO_Guard }; struct SpecialAbility { + SpecialAbility() { + level = 0; + timer = nullptr; + for(int i = 0; i < MAX_SPECIAL_ATTACK_PARAMS; ++i) { + params[i] = 0; + } + } + + ~SpecialAbility() { + safe_delete(timer); + } + int level; Timer *timer; int params[MAX_SPECIAL_ATTACK_PARAMS]; @@ -1177,7 +1189,7 @@ protected: void InsertQuestGlobal(int charid, int npcid, int zoneid, const char *name, const char *value, int expdate); uint16 emoteid; - std::map SpecialAbilities; + SpecialAbility SpecialAbilities[MAX_SPECIAL_ATTACK]; bool bEnraged; bool destructibleobject;