Changed SpecialAttacks to an array instead of a map. Basic access was causing a hotspot. Brief testing doesn't show any obvious bugs but let me know if any prop up.

This commit is contained in:
KimLS 2014-02-12 15:26:08 -08:00
parent 9461067fdb
commit 275f9d6aaf
3 changed files with 51 additions and 77 deletions

View File

@ -121,7 +121,8 @@ enum {
LEASH = 32, LEASH = 32,
TETHER = 33, TETHER = 33,
DESTRUCTIBLE_OBJECT = 34, DESTRUCTIBLE_OBJECT = 34,
NO_HARM_FROM_CLIENT = 35 NO_HARM_FROM_CLIENT = 35,
MAX_SPECIAL_ATTACK = 36
}; };
typedef enum { //fear states typedef enum { //fear states

View File

@ -393,8 +393,6 @@ Mob::~Mob()
SetPet(0); SetPet(0);
} }
ClearSpecialAbilities();
EQApplicationPacket app; EQApplicationPacket app;
CreateDespawnPacket(&app, !IsCorpse()); CreateDespawnPacket(&app, !IsCorpse());
Corpse* corpse = entity_list.GetCorpseByID(GetID()); Corpse* corpse = entity_list.GetCorpseByID(GetID());
@ -4879,111 +4877,74 @@ bool Mob::HasSpellEffect(int effectid)
} }
int Mob::GetSpecialAbility(int ability) { int Mob::GetSpecialAbility(int ability) {
if (SpecialAbilities.count(ability)) if(ability >= MAX_SPECIAL_ATTACK || ability < 0) {
return SpecialAbilities.at(ability).level;
return 0;
}
int Mob::GetSpecialAbilityParam(int ability, int param) {
if(param >= MAX_SPECIAL_ATTACK_PARAMS || param < 0) {
return 0; return 0;
} }
auto iter = SpecialAbilities.find(ability); return SpecialAbilities[ability].level;
if(iter != SpecialAbilities.end()) { }
return iter->second.params[param];
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) { void Mob::SetSpecialAbility(int ability, int level) {
auto iter = SpecialAbilities.find(ability); if(ability >= MAX_SPECIAL_ATTACK || ability < 0) {
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) {
return; return;
} }
auto iter = SpecialAbilities.find(ability); SpecialAbilities[ability].level = level;
if(iter != SpecialAbilities.end()) { }
SpecialAbility spec = iter->second;
spec.params[param] = value; void Mob::SetSpecialAbilityParam(int ability, int param, int value) {
SpecialAbilities[ability] = spec; if(param >= MAX_SPECIAL_ATTACK_PARAMS || param < 0 || ability >= MAX_SPECIAL_ATTACK || ability < 0) {
} else { return;
SpecialAbility spec;
memset(&spec, 0, sizeof spec);
spec.params[param] = value;
spec.timer = nullptr;
SpecialAbilities[ability] = spec;
} }
SpecialAbilities[ability].params[param] = value;
} }
void Mob::StartSpecialAbilityTimer(int ability, uint32 time) { void Mob::StartSpecialAbilityTimer(int ability, uint32 time) {
auto iter = SpecialAbilities.find(ability); if (ability >= MAX_SPECIAL_ATTACK || ability < 0) {
if(iter != SpecialAbilities.end()) { return;
SpecialAbility spec = iter->second; }
if(spec.timer) {
spec.timer->Start(time);
} else {
spec.timer = new Timer(time);
spec.timer->Start();
}
SpecialAbilities[ability] = spec; if(SpecialAbilities[ability].timer) {
SpecialAbilities[ability].timer->Start(time);
} else { } else {
SpecialAbility spec; SpecialAbilities[ability].timer = new Timer(time);
memset(&spec, 0, sizeof spec); SpecialAbilities[ability].timer->Start();
spec.timer = new Timer(time);
spec.timer->Start();
SpecialAbilities[ability] = spec;
} }
} }
void Mob::StopSpecialAbilityTimer(int ability) { void Mob::StopSpecialAbilityTimer(int ability) {
auto iter = SpecialAbilities.find(ability); if (ability >= MAX_SPECIAL_ATTACK || ability < 0) {
if(iter != SpecialAbilities.end()) { return;
SpecialAbility spec = iter->second;
if(spec.timer) {
delete spec.timer;
spec.timer = nullptr;
}
SpecialAbilities[ability] = spec;
} }
safe_delete(SpecialAbilities[ability].timer);
} }
Timer *Mob::GetSpecialAbilityTimer(int ability) { Timer *Mob::GetSpecialAbilityTimer(int ability) {
auto iter = SpecialAbilities.find(ability); if (ability >= MAX_SPECIAL_ATTACK || ability < 0) {
if(iter != SpecialAbilities.end()) { return nullptr;
return iter->second.timer;
} }
return nullptr; return SpecialAbilities[ability].timer;
} }
void Mob::ClearSpecialAbilities() { void Mob::ClearSpecialAbilities() {
auto iter = SpecialAbilities.begin(); for(int a = 0; a < MAX_SPECIAL_ATTACK; ++a) {
while(iter != SpecialAbilities.end()) { SpecialAbilities[a].level = 0;
if(iter->second.timer) { safe_delete(SpecialAbilities[a].timer);
delete iter->second.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) { void Mob::ProcessSpecialAbilities(const std::string str) {

View File

@ -40,6 +40,18 @@ public:
enum eStandingPetOrder { SPO_Follow, SPO_Sit, SPO_Guard }; enum eStandingPetOrder { SPO_Follow, SPO_Sit, SPO_Guard };
struct SpecialAbility { 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; int level;
Timer *timer; Timer *timer;
int params[MAX_SPECIAL_ATTACK_PARAMS]; 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); void InsertQuestGlobal(int charid, int npcid, int zoneid, const char *name, const char *value, int expdate);
uint16 emoteid; uint16 emoteid;
std::map<int, SpecialAbility> SpecialAbilities; SpecialAbility SpecialAbilities[MAX_SPECIAL_ATTACK];
bool bEnraged; bool bEnraged;
bool destructibleobject; bool destructibleobject;