Correct some Aggro calcs

See updated post: http://www.eqemulator.org/forums/showthread.php?t=39819

Aggro:MaxStunProcAggro renamed to Aggro:MaxScalingProcAggro
This commit is contained in:
Michael Cook (mackal) 2015-07-22 16:31:38 -04:00
parent 234b7a3c57
commit fb4cc70999
3 changed files with 26 additions and 34 deletions

View File

@ -1,6 +1,11 @@
EQEMu Changelog (Started on Sept 24, 2003 15:50)
-------------------------------------------------------
== 07/16/2013 ==
== 07/22/2015 ==
mackal: Corrected some hate value calcs based on updated http://www.eqemulator.org/forums/showthread.php?t=39819
Rule Aggro:MaxStunProcAggro to Aggro:MaxScalingProcAggro since the cap applies to more than stuns
== 07/16/2015 ==
mackal: Rework spell aggro based on http://www.eqemulator.org/forums/showthread.php?t=39819
== 07/15/2015 ==

View File

@ -480,7 +480,7 @@ RULE_INT(Aggro, SpellAggroMod, 100)
RULE_INT(Aggro, SongAggroMod, 33)
RULE_INT(Aggro, PetSpellAggroMod, 10)
RULE_REAL(Aggro, TunnelVisionAggroMod, 0.75) //people not currently the top hate generate this much hate on a Tunnel Vision mob
RULE_INT(Aggro, MaxStunProcAggro, 400) // Set to -1 for no limit. Maxmimum amount of aggro that a stun based proc will add.
RULE_INT(Aggro, MaxScalingProcAggro, 400) // Set to -1 for no limit. Maxmimum amount of aggro that HP scaling SPA effect in a proc will add.
RULE_INT(Aggro, IntAggroThreshold, 75) // Int <= this will aggro regardless of level difference.
RULE_CATEGORY_END()

View File

@ -955,18 +955,16 @@ int32 Mob::CheckAggroAmount(uint16 spell_id, Mob *target, bool isproc)
int32 AggroAmount = 0;
int32 nonModifiedAggro = 0;
uint16 slevel = GetLevel();
bool add_default = false;
bool stun_proc = false;
bool dispel = false;
bool on_hatelist = target ? target->CheckAggro(this) : false;
int proc_cap = RuleI(Aggro, MaxScalingProcAggro);
int hate_cap = isproc && proc_cap != -1 ? proc_cap : 1200;
int32 target_hp = target ? target->GetMaxHP() : 18000; // default to max
int32 default_aggro = 0;
int32 default_aggro = 25;
if (target_hp >= 18000) // max
default_aggro = 1200;
else if (target_hp < 390) // min, 390 is the first number with int division that is 26
default_aggro = 25;
else
default_aggro = hate_cap;
else if (target_hp >= 390) // min, 390 is the first number with int division that is 26
default_aggro = target_hp / 15;
for (int o = 0; o < EFFECT_COUNT; o++) {
@ -981,7 +979,7 @@ int32 Mob::CheckAggroAmount(uint16 spell_id, Mob *target, bool isproc)
case SE_MovementSpeed: {
int val = CalcSpellEffectValue_formula(spells[spell_id].formula[o], spells[spell_id].base[o], spells[spell_id].max[o], slevel, spell_id);
if (val < 0)
add_default = true;
AggroAmount += default_aggro;
break;
}
case SE_AttackSpeed:
@ -989,30 +987,27 @@ int32 Mob::CheckAggroAmount(uint16 spell_id, Mob *target, bool isproc)
case SE_AttackSpeed3: {
int val = CalcSpellEffectValue_formula(spells[spell_id].formula[o], spells[spell_id].base[o], spells[spell_id].max[o], slevel, spell_id);
if (val < 100)
add_default = true;
AggroAmount += default_aggro;
break;
}
case SE_Stun:
add_default = true;
stun_proc = isproc;
break;
case SE_Blind:
case SE_Mez:
case SE_Charm:
case SE_Fear:
add_default = true;
AggroAmount += default_aggro;
break;
case SE_Root:
AggroAmount += 10;
break;
case SE_ATK:
case SE_ACv2:
case SE_ArmorClass: {
int val = CalcSpellEffectValue_formula(spells[spell_id].formula[o], spells[spell_id].base[o], spells[spell_id].max[o], slevel, spell_id);
if (val < 0)
add_default = true;
AggroAmount += default_aggro;
break;
}
case SE_ATK:
case SE_ResistMagic:
case SE_ResistFire:
case SE_ResistCold:
@ -1049,7 +1044,7 @@ int32 Mob::CheckAggroAmount(uint16 spell_id, Mob *target, bool isproc)
case SE_Amnesia:
case SE_Silence:
case SE_Destroy:
add_default = true;
AggroAmount += default_aggro;
break;
// unsure -- leave them this for now
case SE_Harmony:
@ -1095,14 +1090,8 @@ int32 Mob::CheckAggroAmount(uint16 spell_id, Mob *target, bool isproc)
}
}
if (add_default) {
if (stun_proc && RuleI(Aggro, MaxStunProcAggro) > -1 && (default_aggro > RuleI(Aggro, MaxStunProcAggro)))
AggroAmount += RuleI(Aggro, MaxStunProcAggro);
else if (IsBardSong(spell_id) && default_aggro > 40)
AggroAmount += 40; // bard songs seem to cap to 40 for most of their spells?
else
AggroAmount += default_aggro;
}
if (IsBardSong(spell_id) && AggroAmount > 40)
AggroAmount = 40; // bard songs seem to cap to 40 for most of their spells?
if (dispel && target && target->GetHateAmount(this) < 100)
AggroAmount += 50;
@ -1113,7 +1102,8 @@ int32 Mob::CheckAggroAmount(uint16 spell_id, Mob *target, bool isproc)
if (GetOwner() && IsPet())
AggroAmount = AggroAmount * RuleI(Aggro, PetSpellAggroMod) / 100;
if (AggroAmount > 0) {
// hate focus ignored on first action for some reason
if (!on_hatelist && AggroAmount > 0) {
int HateMod = RuleI(Aggro, SpellAggroMod);
HateMod += GetFocusEffect(focusSpellHateMod, spell_id);
@ -1123,7 +1113,7 @@ int32 Mob::CheckAggroAmount(uint16 spell_id, Mob *target, bool isproc)
AggroAmount = (AggroAmount * HateMod) / 100;
}
// initial aggro gets a bonus 100
// initial aggro gets a bonus 100 besides for dispel or hate override
if (!dispel && spells[spell_id].HateAdded == 0 && !on_hatelist)
AggroAmount += 100;
@ -1161,8 +1151,8 @@ int32 Mob::CheckHealAggroAmount(uint16 spell_id, Mob *target, uint32 heal_possib
break;
}
case SE_Rune:
AggroAmount += CalcSpellEffectValue_formula(spells[spell_id].formula[0],
spells[spell_id].base[0], spells[spell_id].max[o], GetLevel(), spell_id) * 2;
AggroAmount += CalcSpellEffectValue_formula(spells[spell_id].formula[o],
spells[spell_id].base[o], spells[spell_id].max[o], GetLevel(), spell_id) * 2;
ignore_default_buff = true;
break;
case SE_HealOverTime:
@ -1189,10 +1179,7 @@ int32 Mob::CheckHealAggroAmount(uint16 spell_id, Mob *target, uint32 heal_possib
AggroAmount = (AggroAmount * HateMod) / 100;
}
if (AggroAmount < 0)
return 0;
else
return AggroAmount;
return std::max(0, AggroAmount);
}
void Mob::AddFeignMemory(Client* attacker) {