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,
TETHER = 33,
DESTRUCTIBLE_OBJECT = 34,
NO_HARM_FROM_CLIENT = 35
NO_HARM_FROM_CLIENT = 35,
MAX_SPECIAL_ATTACK = 36
};
typedef enum { //fear states

View File

@ -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) {

View File

@ -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<int, SpecialAbility> SpecialAbilities;
SpecialAbility SpecialAbilities[MAX_SPECIAL_ATTACK];
bool bEnraged;
bool destructibleobject;