mirror of
https://github.com/EQEmu/Server.git
synced 2026-09-03 01:06:36 +00:00
Implemented SPA 515,516,518,496
Implemented SE_AC_Avoidance_Max_Percent 515 SE_AC_Mitigation_Max_Percent 516 SE_Attack_Accuracy_Max_Percent 518 Above are stackable defense and offensive mods SE_Critical_Melee_Damage_Mod_Max 496 - This is a non stackable melee critical modifier
This commit is contained in:
+13
-3
@@ -190,8 +190,8 @@ int Mob::GetTotalToHit(EQ::skills::SkillType skill, int chance_mod)
|
||||
|
||||
//518 Increase ATK accuracy by percentage, stackable
|
||||
auto atkhit_bonus = itembonuses.Attack_Accuracy_Max_Percent + aabonuses.Attack_Accuracy_Max_Percent + spellbonuses.Attack_Accuracy_Max_Percent;
|
||||
|
||||
accuracy += (accuracy * atkhit_bonus) / 10000;
|
||||
if (atkhit_bonus)
|
||||
accuracy += round(static_cast<double>(accuracy) * static_cast<double>(atkhit_bonus) * 0.0001);
|
||||
|
||||
// 216 Melee Accuracy Amt aka SE_Accuracy -- flat bonus
|
||||
accuracy += itembonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1] +
|
||||
@@ -238,6 +238,11 @@ int Mob::compute_defense()
|
||||
if (IsClient())
|
||||
defense += CastToClient()->GetHeroicAGI() / 10;
|
||||
|
||||
//516 SE_AC_Mitigation_Max_Percent
|
||||
auto ac_bonus = itembonuses.AC_Mitigation_Max_Percent + aabonuses.AC_Mitigation_Max_Percent + spellbonuses.AC_Mitigation_Max_Percent;
|
||||
if (ac_bonus)
|
||||
defense += round(static_cast<double>(defense) * static_cast<double>(ac_bonus) * 0.0001);
|
||||
|
||||
defense += itembonuses.AvoidMeleeChance; // item mod2
|
||||
if (IsNPC())
|
||||
defense += CastToNPC()->GetAvoidanceRating();
|
||||
@@ -260,7 +265,12 @@ int Mob::GetTotalDefense()
|
||||
auto evasion_bonus = spellbonuses.AvoidMeleeChanceEffect; // we check this first since it has a special case
|
||||
if (evasion_bonus >= 10000)
|
||||
return -1;
|
||||
//
|
||||
|
||||
// 515 SE_AC_Avoidance_Max_Percent
|
||||
auto ac_aviodance_bonus = itembonuses.AC_Avoidance_Max_Percent + aabonuses.AC_Avoidance_Max_Percent + spellbonuses.AC_Avoidance_Max_Percent;
|
||||
if (ac_aviodance_bonus)
|
||||
avoidance += round(static_cast<double>(avoidance) * static_cast<double>(ac_aviodance_bonus) * 0.0001);
|
||||
|
||||
// 172 Evasion aka SE_AvoidMeleeChance
|
||||
evasion_bonus += itembonuses.AvoidMeleeChanceEffect + aabonuses.AvoidMeleeChanceEffect; // item bonus here isn't mod2 avoidance
|
||||
|
||||
|
||||
@@ -1102,6 +1102,19 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon)
|
||||
break;
|
||||
}
|
||||
|
||||
case SE_Critical_Melee_Damage_Mod_Max:
|
||||
{
|
||||
// Bad data or unsupported new skill
|
||||
if (base2 > EQ::skills::HIGHEST_SKILL)
|
||||
break;
|
||||
int skill = base2 == ALL_SKILLS ? EQ::skills::HIGHEST_SKILL + 1 : base2;
|
||||
if (base1 < 0 && newbon->CritDmgModNoStack[skill] > base1)
|
||||
newbon->CritDmgModNoStack[skill] = base1;
|
||||
else if (base1 > 0 && newbon->CritDmgModNoStack[skill] < base1)
|
||||
newbon->CritDmgModNoStack[skill] = base1;
|
||||
break;
|
||||
}
|
||||
|
||||
case SE_CriticalSpellChance: {
|
||||
newbon->CriticalSpellChance += base1;
|
||||
|
||||
@@ -1491,6 +1504,14 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon)
|
||||
newbon->Attack_Accuracy_Max_Percent += base1;
|
||||
break;
|
||||
|
||||
case SE_AC_Mitigation_Max_Percent:
|
||||
newbon->AC_Mitigation_Max_Percent += base1;
|
||||
break;
|
||||
|
||||
case SE_AC_Avoidance_Max_Percent:
|
||||
newbon->AC_Avoidance_Max_Percent += base1;
|
||||
break;
|
||||
|
||||
// to do
|
||||
case SE_PetDiscipline:
|
||||
break;
|
||||
@@ -2489,6 +2510,20 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne
|
||||
break;
|
||||
}
|
||||
|
||||
case SE_Critical_Melee_Damage_Mod_Max:
|
||||
{
|
||||
// Bad data or unsupported new skill
|
||||
if (base2 > EQ::skills::HIGHEST_SKILL)
|
||||
break;
|
||||
int skill = base2 == ALL_SKILLS ? EQ::skills::HIGHEST_SKILL + 1 : base2;
|
||||
if (effect_value < 0 && new_bonus->CritDmgModNoStack[skill] > effect_value)
|
||||
new_bonus->CritDmgModNoStack[skill] = effect_value;
|
||||
else if (effect_value > 0 && new_bonus->CritDmgModNoStack[skill] < effect_value) {
|
||||
new_bonus->CritDmgModNoStack[skill] = effect_value;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case SE_ReduceSkillTimer:
|
||||
{
|
||||
if(new_bonus->SkillReuseTime[base2] < effect_value)
|
||||
@@ -3266,6 +3301,17 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne
|
||||
case SE_Attack_Accuracy_Max_Percent:
|
||||
new_bonus->Attack_Accuracy_Max_Percent += effect_value;
|
||||
break;
|
||||
|
||||
|
||||
case SE_AC_Mitigation_Max_Percent:
|
||||
new_bonus->AC_Mitigation_Max_Percent += effect_value;
|
||||
break;
|
||||
|
||||
case SE_AC_Avoidance_Max_Percent:
|
||||
new_bonus->AC_Avoidance_Max_Percent += effect_value;
|
||||
break;
|
||||
|
||||
|
||||
|
||||
//Special custom cases for loading effects on to NPC from 'npc_spels_effects' table
|
||||
if (IsAISpellEffect) {
|
||||
@@ -4274,6 +4320,17 @@ void Mob::NegateSpellsBonuses(uint16 spell_id)
|
||||
break;
|
||||
}
|
||||
|
||||
case SE_Critical_Melee_Damage_Mod_Max:
|
||||
{
|
||||
for (int e = 0; e < EQ::skills::HIGHEST_SKILL + 1; e++)
|
||||
{
|
||||
spellbonuses.CritDmgModNoStack[e] = effect_value;
|
||||
aabonuses.CritDmgModNoStack[e] = effect_value;
|
||||
itembonuses.CritDmgModNoStack[e] = effect_value;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case SE_SkillDamageAmount:
|
||||
{
|
||||
for (int e = 0; e < EQ::skills::HIGHEST_SKILL + 1; e++)
|
||||
@@ -4790,6 +4847,25 @@ void Mob::NegateSpellsBonuses(uint16 spell_id)
|
||||
aabonuses.IllusionPersistence = false;
|
||||
break;
|
||||
|
||||
case SE_Attack_Accuracy_Max_Percent:
|
||||
spellbonuses.Attack_Accuracy_Max_Percent = effect_value;
|
||||
itembonuses.Attack_Accuracy_Max_Percent = effect_value;
|
||||
aabonuses.Attack_Accuracy_Max_Percent = effect_value;
|
||||
break;
|
||||
|
||||
|
||||
case SE_AC_Mitigation_Max_Percent:
|
||||
spellbonuses.AC_Mitigation_Max_Percent = effect_value;
|
||||
itembonuses.AC_Mitigation_Max_Percent = effect_value;
|
||||
aabonuses.AC_Mitigation_Max_Percent = effect_value;
|
||||
break;
|
||||
|
||||
case SE_AC_Avoidance_Max_Percent:
|
||||
spellbonuses.AC_Avoidance_Max_Percent = effect_value;
|
||||
itembonuses.AC_Avoidance_Max_Percent = effect_value;
|
||||
aabonuses.AC_Avoidance_Max_Percent = effect_value;
|
||||
break;
|
||||
|
||||
case SE_SkillProcSuccess:{
|
||||
for(int e = 0; e < MAX_SKILL_PROCS; e++)
|
||||
{
|
||||
|
||||
@@ -461,6 +461,7 @@ struct StatBonuses {
|
||||
uint32 SpellOnKill[MAX_SPELL_TRIGGER*3]; // Chance to proc after killing a mob
|
||||
uint32 SpellOnDeath[MAX_SPELL_TRIGGER*2]; // Chance to have effect cast when you die
|
||||
int32 CritDmgMod[EQ::skills::HIGHEST_SKILL + 2]; // All Skills + -1
|
||||
int32 CritDmgModNoStack[EQ::skills::HIGHEST_SKILL + 2];// Critical melee damage modifier by percent, does not stack.
|
||||
int32 SkillReuseTime[EQ::skills::HIGHEST_SKILL + 1]; // Reduces skill timers
|
||||
int32 SkillDamageAmount[EQ::skills::HIGHEST_SKILL + 2]; // All Skills + -1
|
||||
int32 TwoHandBluntBlock; // chance to block when wielding two hand blunt weapon
|
||||
@@ -525,6 +526,8 @@ struct StatBonuses {
|
||||
uint32 PC_Pet_Rampage[2]; // 0= % chance to rampage, 1=damage modifier
|
||||
uint32 PC_Pet_Flurry; // Percent chance flurry from double attack
|
||||
int32 Attack_Accuracy_Max_Percent; // Increase ATK accuracy by percent.
|
||||
int32 AC_Mitigation_Max_Percent; // Increase AC mitigation by percent
|
||||
int32 AC_Avoidance_Max_Percent; // Increase AC avoidance by percent
|
||||
|
||||
// AAs
|
||||
int8 Packrat; //weight reduction for items, 1 point = 10%
|
||||
|
||||
+5
-2
@@ -4624,10 +4624,13 @@ int16 Mob::GetCritDmgMod(uint16 skill)
|
||||
{
|
||||
int critDmg_mod = 0;
|
||||
|
||||
// All skill dmg mod + Skill specific
|
||||
// All skill dmg mod + Skill specific [SPA 330 and 496]
|
||||
critDmg_mod += itembonuses.CritDmgMod[EQ::skills::HIGHEST_SKILL + 1] + spellbonuses.CritDmgMod[EQ::skills::HIGHEST_SKILL + 1] + aabonuses.CritDmgMod[EQ::skills::HIGHEST_SKILL + 1] +
|
||||
itembonuses.CritDmgMod[skill] + spellbonuses.CritDmgMod[skill] + aabonuses.CritDmgMod[skill];
|
||||
|
||||
Shout("Mod 1 %i", critDmg_mod);
|
||||
critDmg_mod += itembonuses.CritDmgModNoStack[EQ::skills::HIGHEST_SKILL + 1] + spellbonuses.CritDmgModNoStack[EQ::skills::HIGHEST_SKILL + 1] + aabonuses.CritDmgModNoStack[EQ::skills::HIGHEST_SKILL + 1] +
|
||||
itembonuses.CritDmgModNoStack[skill] + spellbonuses.CritDmgModNoStack[skill] + aabonuses.CritDmgModNoStack[skill];
|
||||
Shout("Mod 2 %i", critDmg_mod);
|
||||
return critDmg_mod;
|
||||
}
|
||||
|
||||
|
||||
@@ -3122,6 +3122,10 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove
|
||||
case SE_Duration_Mana_Pct:
|
||||
case SE_Duration_Endurance_Pct:
|
||||
case SE_Endurance_Absorb_Pct_Damage:
|
||||
case SE_AC_Mitigation_Max_Percent:
|
||||
case SE_AC_Avoidance_Max_Percent:
|
||||
case SE_Attack_Accuracy_Max_Percent:
|
||||
case SE_Critical_Melee_Damage_Mod_Max:
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user