DoT critcal fix

Range check on DivA type effects
This commit is contained in:
KayenEQ 2014-02-10 10:18:53 -05:00
parent 835d2ef74c
commit 9d78eec485
7 changed files with 158 additions and 71 deletions

View File

@ -1,5 +1,10 @@
EQEMu Changelog (Started on Sept 24, 2003 15:50) EQEMu Changelog (Started on Sept 24, 2003 15:50)
------------------------------------------------------- -------------------------------------------------------
== 02/10/2014 ==
Kayen: Divine Arbiration and other similar spell effects will now utilize a spell range check.
Kayen: Revised how heal amount is calculated to properly incorporate all current focus effects/bonuses.
Kayen: Various updates/fixes/clean-ups to focus effect related code. Focus effect limits should now all work properly.
== 02/09/2014 == == 02/09/2014 ==
Sorvani: Added new spawn condition onchange action: DoRepopIfReady. Choosing this will not repop mobs when the spawn condition is enabled if they have an existing respawn timer. Additionally, this condition will not even attempt repop when the condition is is changed to disabled. Will be in use on PEQ for: Cragbeast Queen in Natimbi. Sorvani: Added new spawn condition onchange action: DoRepopIfReady. Choosing this will not repop mobs when the spawn condition is enabled if they have an existing respawn timer. Additionally, this condition will not even attempt repop when the condition is is changed to disabled. Will be in use on PEQ for: Cragbeast Queen in Natimbi.
Secrets: Fixed a weird crash issue with deletion of pointers if task loading fails. Secrets: Fixed a weird crash issue with deletion of pointers if task loading fails.

View File

@ -167,7 +167,7 @@ int32 Client::GetActDoTDamage(uint16 spell_id, int32 value, Mob* target) {
if (chance > 0 && (MakeRandomInt(1, 100) <= chance)) { if (chance > 0 && (MakeRandomInt(1, 100) <= chance)) {
int32 ratio = 100; int32 ratio = 200;
ratio += itembonuses.DotCritDmgIncrease + spellbonuses.DotCritDmgIncrease + aabonuses.DotCritDmgIncrease; ratio += itembonuses.DotCritDmgIncrease + spellbonuses.DotCritDmgIncrease + aabonuses.DotCritDmgIncrease;
value = value_BaseEffect*ratio/100; value = value_BaseEffect*ratio/100;

View File

@ -1057,17 +1057,27 @@ void Client::LeaveGroup() {
isgrouped = false; isgrouped = false;
} }
void Group::HealGroup(uint32 heal_amt, Mob* caster) void Group::HealGroup(uint32 heal_amt, Mob* caster, int32 range)
{ {
if (!caster) if (!caster)
return; return;
if (!range)
range = 200;
float distance;
float range2 = range*range;
int numMem = 0; int numMem = 0;
unsigned int gi = 0; unsigned int gi = 0;
for(; gi < MAX_GROUP_MEMBERS; gi++) for(; gi < MAX_GROUP_MEMBERS; gi++)
{ {
if(members[gi]){ if(members[gi]){
numMem += 1; distance = caster->DistNoRoot(*members[gi]);
if(distance <= range2){
numMem += 1;
}
} }
} }
@ -1075,23 +1085,38 @@ void Group::HealGroup(uint32 heal_amt, Mob* caster)
for(gi = 0; gi < MAX_GROUP_MEMBERS; gi++) for(gi = 0; gi < MAX_GROUP_MEMBERS; gi++)
{ {
if(members[gi]){ if(members[gi]){
//members[gi]->SetHP(members[gi]->GetHP() + heal_amt); distance = caster->DistNoRoot(*members[gi]);
members[gi]->HealDamage(heal_amt, caster); if(distance <= range2){
members[gi]->SendHPUpdate(); members[gi]->HealDamage(heal_amt, caster);
members[gi]->SendHPUpdate();
}
} }
} }
} }
void Group::BalanceHP(int32 penalty) void Group::BalanceHP(int32 penalty, int32 range, Mob* caster)
{ {
if (!caster)
return;
if (!range)
range = 200;
int dmgtaken = 0, numMem = 0; int dmgtaken = 0, numMem = 0;
float distance;
float range2 = range*range;
unsigned int gi = 0; unsigned int gi = 0;
for(; gi < MAX_GROUP_MEMBERS; gi++) for(; gi < MAX_GROUP_MEMBERS; gi++)
{ {
if(members[gi]){ if(members[gi]){
dmgtaken += (members[gi]->GetMaxHP() - members[gi]->GetHP()); distance = caster->DistNoRoot(*members[gi]);
numMem += 1; if(distance <= range2){
dmgtaken += (members[gi]->GetMaxHP() - members[gi]->GetHP());
numMem += 1;
}
} }
} }
@ -1100,27 +1125,42 @@ void Group::BalanceHP(int32 penalty)
for(gi = 0; gi < MAX_GROUP_MEMBERS; gi++) for(gi = 0; gi < MAX_GROUP_MEMBERS; gi++)
{ {
if(members[gi]){ if(members[gi]){
if((members[gi]->GetMaxHP() - dmgtaken) < 1){ //this way the ability will never kill someone distance = caster->DistNoRoot(*members[gi]);
members[gi]->SetHP(1); //but it will come darn close if(distance <= range2){
members[gi]->SendHPUpdate(); if((members[gi]->GetMaxHP() - dmgtaken) < 1){ //this way the ability will never kill someone
} members[gi]->SetHP(1); //but it will come darn close
else{ members[gi]->SendHPUpdate();
members[gi]->SetHP(members[gi]->GetMaxHP() - dmgtaken); }
members[gi]->SendHPUpdate(); else{
members[gi]->SetHP(members[gi]->GetMaxHP() - dmgtaken);
members[gi]->SendHPUpdate();
}
} }
} }
} }
} }
void Group::BalanceMana(int32 penalty) void Group::BalanceMana(int32 penalty, int32 range, Mob* caster)
{ {
if (!caster)
return;
if (!range)
range = 200;
float distance;
float range2 = range*range;
int manataken = 0, numMem = 0; int manataken = 0, numMem = 0;
unsigned int gi = 0; unsigned int gi = 0;
for(; gi < MAX_GROUP_MEMBERS; gi++) for(; gi < MAX_GROUP_MEMBERS; gi++)
{ {
if(members[gi]){ if(members[gi]){
manataken += (members[gi]->GetMaxMana() - members[gi]->GetMana()); distance = caster->DistNoRoot(*members[gi]);
numMem += 1; if(distance <= range2){
manataken += (members[gi]->GetMaxMana() - members[gi]->GetMana());
numMem += 1;
}
} }
} }
@ -1129,15 +1169,18 @@ void Group::BalanceMana(int32 penalty)
for(gi = 0; gi < MAX_GROUP_MEMBERS; gi++) for(gi = 0; gi < MAX_GROUP_MEMBERS; gi++)
{ {
if(members[gi]){ if(members[gi]){
if((members[gi]->GetMaxMana() - manataken) < 1){ distance = caster->DistNoRoot(*members[gi]);
members[gi]->SetMana(1); if(distance <= range2){
if (members[gi]->IsClient()) if((members[gi]->GetMaxMana() - manataken) < 1){
members[gi]->CastToClient()->SendManaUpdate(); members[gi]->SetMana(1);
} if (members[gi]->IsClient())
else{ members[gi]->CastToClient()->SendManaUpdate();
members[gi]->SetMana(members[gi]->GetMaxMana() - manataken); }
if (members[gi]->IsClient()) else{
members[gi]->CastToClient()->SendManaUpdate(); members[gi]->SetMana(members[gi]->GetMaxMana() - manataken);
if (members[gi]->IsClient())
members[gi]->CastToClient()->SendManaUpdate();
}
} }
} }
} }

View File

@ -86,9 +86,9 @@ public:
uint16 GetAvgLevel(); uint16 GetAvgLevel();
bool LearnMembers(); bool LearnMembers();
void VerifyGroup(); void VerifyGroup();
void BalanceHP(int32 penalty); void BalanceHP(int32 penalty, int32 range = 0, Mob* caster = nullptr);
void BalanceMana(int32 penalty); void BalanceMana(int32 penalty, int32 range = 0, Mob* caster = nullptr);
void HealGroup(uint32 heal_amt, Mob* caster); void HealGroup(uint32 heal_amt, Mob* caster, int32 range = 0);
inline void SetGroupAAs(GroupLeadershipAA_Struct *From) { memcpy(&LeaderAbilities, From, sizeof(GroupLeadershipAA_Struct)); } inline void SetGroupAAs(GroupLeadershipAA_Struct *From) { memcpy(&LeaderAbilities, From, sizeof(GroupLeadershipAA_Struct)); }
inline void GetGroupAAs(GroupLeadershipAA_Struct *Into) { memcpy(Into, &LeaderAbilities, sizeof(GroupLeadershipAA_Struct)); } inline void GetGroupAAs(GroupLeadershipAA_Struct *Into) { memcpy(Into, &LeaderAbilities, sizeof(GroupLeadershipAA_Struct)); }
void UpdateGroupAAs(); void UpdateGroupAAs();

View File

@ -461,11 +461,17 @@ uint32 Raid::GetTotalRaidDamage(Mob* other)
return total; return total;
} }
void Raid::HealGroup(uint32 heal_amt, Mob* caster, uint32 gid) void Raid::HealGroup(uint32 heal_amt, Mob* caster, uint32 gid, int32 range)
{ {
if (!caster) if (!caster)
return; return;
if (!range)
range = 200;
float distance;
float range2 = range*range;
int numMem = 0; int numMem = 0;
unsigned int gi = 0; unsigned int gi = 0;
for(; gi < MAX_RAID_MEMBERS; gi++) for(; gi < MAX_RAID_MEMBERS; gi++)
@ -473,7 +479,10 @@ void Raid::HealGroup(uint32 heal_amt, Mob* caster, uint32 gid)
if(members[gi].member){ if(members[gi].member){
if(members[gi].GroupNumber == gid) if(members[gi].GroupNumber == gid)
{ {
numMem += 1; distance = caster->DistNoRoot(*members[gi].member);
if(distance <= range2){
numMem += 1;
}
} }
} }
} }
@ -484,25 +493,41 @@ void Raid::HealGroup(uint32 heal_amt, Mob* caster, uint32 gid)
if(members[gi].member){ if(members[gi].member){
if(members[gi].GroupNumber == gid) if(members[gi].GroupNumber == gid)
{ {
members[gi].member->SetHP(members[gi].member->GetHP() + heal_amt); distance = caster->DistNoRoot(*members[gi].member);
members[gi].member->SendHPUpdate(); if(distance <= range2){
members[gi].member->SetHP(members[gi].member->GetHP() + heal_amt);
members[gi].member->SendHPUpdate();
}
} }
} }
} }
} }
void Raid::BalanceHP(int32 penalty, uint32 gid) void Raid::BalanceHP(int32 penalty, uint32 gid, int32 range, Mob* caster)
{ {
if (!caster)
return;
if (!range)
range = 200;
int dmgtaken = 0, numMem = 0; int dmgtaken = 0, numMem = 0;
int gi = 0; int gi = 0;
float distance;
float range2 = range*range;
for(; gi < MAX_RAID_MEMBERS; gi++) for(; gi < MAX_RAID_MEMBERS; gi++)
{ {
if(members[gi].member){ if(members[gi].member){
if(members[gi].GroupNumber == gid) if(members[gi].GroupNumber == gid)
{ {
dmgtaken += (members[gi].member->GetMaxHP() - members[gi].member->GetHP()); distance = caster->DistNoRoot(*members[gi].member);
numMem += 1; if(distance <= range2){
dmgtaken += (members[gi].member->GetMaxHP() - members[gi].member->GetHP());
numMem += 1;
}
} }
} }
} }
@ -514,21 +539,33 @@ void Raid::BalanceHP(int32 penalty, uint32 gid)
if(members[gi].member){ if(members[gi].member){
if(members[gi].GroupNumber == gid) if(members[gi].GroupNumber == gid)
{ {
if((members[gi].member->GetMaxHP() - dmgtaken) < 1){//this way the ability will never kill someone distance = caster->DistNoRoot(*members[gi].member);
members[gi].member->SetHP(1); //but it will come darn close if(distance <= range2){
members[gi].member->SendHPUpdate(); if((members[gi].member->GetMaxHP() - dmgtaken) < 1){//this way the ability will never kill someone
} members[gi].member->SetHP(1); //but it will come darn close
else{ members[gi].member->SendHPUpdate();
members[gi].member->SetHP(members[gi].member->GetMaxHP() - dmgtaken); }
members[gi].member->SendHPUpdate(); else{
members[gi].member->SetHP(members[gi].member->GetMaxHP() - dmgtaken);
members[gi].member->SendHPUpdate();
}
} }
} }
} }
} }
} }
void Raid::BalanceMana(int32 penalty, uint32 gid) void Raid::BalanceMana(int32 penalty, uint32 gid, int32 range, Mob* caster)
{ {
if (!caster)
return;
if (!range)
range = 200;
float distance;
float range2 = range*range;
int manataken = 0, numMem = 0; int manataken = 0, numMem = 0;
int gi = 0; int gi = 0;
for(; gi < MAX_RAID_MEMBERS; gi++) for(; gi < MAX_RAID_MEMBERS; gi++)
@ -536,8 +573,11 @@ void Raid::BalanceMana(int32 penalty, uint32 gid)
if(members[gi].member){ if(members[gi].member){
if(members[gi].GroupNumber == gid) if(members[gi].GroupNumber == gid)
{ {
manataken += (members[gi].member->GetMaxMana() - members[gi].member->GetMana()); distance = caster->DistNoRoot(*members[gi].member);
numMem += 1; if(distance <= range2){
manataken += (members[gi].member->GetMaxMana() - members[gi].member->GetMana());
numMem += 1;
}
} }
} }
} }
@ -549,15 +589,18 @@ void Raid::BalanceMana(int32 penalty, uint32 gid)
if(members[gi].member){ if(members[gi].member){
if(members[gi].GroupNumber == gid) if(members[gi].GroupNumber == gid)
{ {
if((members[gi].member->GetMaxMana() - manataken) < 1){ distance = caster->DistNoRoot(*members[gi].member);
members[gi].member->SetMana(1); if(distance <= range2){
if (members[gi].member->IsClient()) if((members[gi].member->GetMaxMana() - manataken) < 1){
members[gi].member->CastToClient()->SendManaUpdate(); members[gi].member->SetMana(1);
} if (members[gi].member->IsClient())
else{ members[gi].member->CastToClient()->SendManaUpdate();
members[gi].member->SetMana(members[gi].member->GetMaxMana() - manataken); }
if (members[gi].member->IsClient()) else{
members[gi].member->CastToClient()->SendManaUpdate(); members[gi].member->SetMana(members[gi].member->GetMaxMana() - manataken);
if (members[gi].member->IsClient())
members[gi].member->CastToClient()->SendManaUpdate();
}
} }
} }
} }

View File

@ -147,9 +147,9 @@ public:
void CastGroupSpell(Mob* caster,uint16 spellid, uint32 gid); void CastGroupSpell(Mob* caster,uint16 spellid, uint32 gid);
void SplitExp(uint32 exp, Mob* other); void SplitExp(uint32 exp, Mob* other);
uint32 GetTotalRaidDamage(Mob* other); uint32 GetTotalRaidDamage(Mob* other);
void BalanceHP(int32 penalty, uint32 gid); void BalanceHP(int32 penalty, uint32 gid, int32 range = 0, Mob* caster = nullptr);
void BalanceMana(int32 penalty, uint32 gid); void BalanceMana(int32 penalty, uint32 gid, int32 range = 0, Mob* caster = nullptr);
void HealGroup(uint32 heal_amt, Mob* caster, uint32 gid); void HealGroup(uint32 heal_amt, Mob* caster, uint32 gid, int32 range = 0);
void SplitMoney(uint32 copper, uint32 silver, uint32 gold, uint32 platinum, Client *splitter = nullptr); void SplitMoney(uint32 copper, uint32 silver, uint32 gold, uint32 platinum, Client *splitter = nullptr);
void GroupBardPulse(Mob* caster, uint16 spellid, uint32 gid); void GroupBardPulse(Mob* caster, uint16 spellid, uint32 gid);

View File

@ -2445,7 +2445,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial)
gid = r->GetGroup(caster->GetName()); gid = r->GetGroup(caster->GetName());
if(gid < 11) if(gid < 11)
{ {
r->BalanceHP(spell.base[i], gid); r->BalanceHP(spell.base[i], gid, spell.range, caster);
break; break;
} }
} }
@ -2455,7 +2455,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial)
if(!g) if(!g)
break; break;
g->BalanceHP(spell.base[i]); g->BalanceHP(spell.base[i], spell.range, caster);
break; break;
} }
@ -2473,7 +2473,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial)
gid = r->GetGroup(caster->GetName()); gid = r->GetGroup(caster->GetName());
if(gid < 11) if(gid < 11)
{ {
r->BalanceMana(spell.base[i], gid); r->BalanceMana(spell.base[i], gid, spell.range, caster);
break; break;
} }
} }
@ -2483,7 +2483,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial)
if(!g) if(!g)
break; break;
g->BalanceMana(spell.base[i]); g->BalanceMana(spell.base[i], spell.range, caster);
break; break;
} }
@ -2579,7 +2579,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial)
gid = r->GetGroup(caster->GetName()); gid = r->GetGroup(caster->GetName());
if(gid < 11) if(gid < 11)
{ {
r->HealGroup(heal_amt,caster, gid); r->HealGroup(heal_amt,caster, gid, spell.range);
break; break;
} }
} }
@ -2591,7 +2591,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial)
break; break;
} }
g->HealGroup(heal_amt, caster); g->HealGroup(heal_amt, caster, spell.range);
break; break;
} }
@ -3978,10 +3978,6 @@ int16 Client::CalcAAFocus(focusType type, uint32 aa_ID, uint16 spell_id)
int lvlModifier = 100; int lvlModifier = 100;
int spell_level = 0; int spell_level = 0;
int lvldiff = 0; int lvldiff = 0;
bool LimitSpellSkill = false;
bool SpellSkill_Found = false;
bool LimitSpellEffect = false;
bool SpellEffect_Found = false;
uint32 effect = 0; uint32 effect = 0;
int32 base1 = 0; int32 base1 = 0;
int32 base2 = 0; int32 base2 = 0;