mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-15 16:41:29 +00:00
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:
parent
9461067fdb
commit
275f9d6aaf
@ -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
|
||||||
|
|||||||
111
zone/mob.cpp
111
zone/mob.cpp
@ -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) {
|
||||||
|
|||||||
14
zone/mob.h
14
zone/mob.h
@ -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;
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user