mirror of
https://github.com/EQEmu/Server.git
synced 2026-06-27 04:07:39 +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:
+11
-11
@@ -838,7 +838,7 @@ typedef enum {
|
|||||||
//#define SE_Ff_Endurance_Max 493 //
|
//#define SE_Ff_Endurance_Max 493 //
|
||||||
//#define SE_Pet_Add_Atk 494 //
|
//#define SE_Pet_Add_Atk 494 //
|
||||||
//#define SE_Ff_DurationMax 495 //
|
//#define SE_Ff_DurationMax 495 //
|
||||||
//#define SE_Critical_Melee_Damage_Mod_Max 496 //
|
#define SE_Critical_Melee_Damage_Mod_Max 496 // implemented -
|
||||||
//#define SE_Ff_FocusCastProcNoBypass 497 //
|
//#define SE_Ff_FocusCastProcNoBypass 497 //
|
||||||
//#define SE_AddExtraAttackPct_1h_Primary 498 //
|
//#define SE_AddExtraAttackPct_1h_Primary 498 //
|
||||||
//#define SE_AddExtraAttackPct_1h_Secondary 499 //
|
//#define SE_AddExtraAttackPct_1h_Secondary 499 //
|
||||||
@@ -851,24 +851,24 @@ typedef enum {
|
|||||||
//#define SE_Damage_Taken_Position_Amt 506 //
|
//#define SE_Damage_Taken_Position_Amt 506 //
|
||||||
//#define SE_Fc_Amplify_Mod 507 //
|
//#define SE_Fc_Amplify_Mod 507 //
|
||||||
//#define SE_Fc_Amplify_Amt 508 //
|
//#define SE_Fc_Amplify_Amt 508 //
|
||||||
#define SE_Health_Transfer 509 //
|
#define SE_Health_Transfer 509 // implemented -
|
||||||
//#define SE_Fc_ResistIncoming 510 //
|
//#define SE_Fc_ResistIncoming 510 //
|
||||||
//#define SE_Ff_FocusTimerMin 511 //
|
//#define SE_Ff_FocusTimerMin 511 //
|
||||||
//#define SE_Proc_Timer_Modifier 512 //
|
//#define SE_Proc_Timer_Modifier 512 //
|
||||||
//#define SE_Mana_Max_Percent 513 //
|
//#define SE_Mana_Max_Percent 513 //
|
||||||
//#define SE_Endurance_Max_Percent 514 //
|
//#define SE_Endurance_Max_Percent 514 //
|
||||||
//#define SE_AC_Avoidance_Max_Percent 515 // 515 is before 172 TotalEffect(515) * static_cast<double>(avoidance_ac) * 0.0001 that value is then rounded with a +/- 0.5
|
#define SE_AC_Avoidance_Max_Percent 515 // implemented - 515 is before 172
|
||||||
//#define SE_AC_Mitigation_Max_Percent 516 // 516 is after AGI bonus
|
#define SE_AC_Mitigation_Max_Percent 516 // implemented - 516 is after AGI bonus
|
||||||
//#define SE_Attack_Offense_Max_Percent 517 // Requires too much rewrite of code.
|
//#define SE_Attack_Offense_Max_Percent 517 // Requires too much rewrite of code.
|
||||||
#define SE_Attack_Accuracy_Max_Percent 518 //
|
#define SE_Attack_Accuracy_Max_Percent 518 // implemented -
|
||||||
//#define SE_Luck_Amount 519 //
|
//#define SE_Luck_Amount 519 //
|
||||||
//#define SE_Luck_Percent 520 //
|
//#define SE_Luck_Percent 520 //
|
||||||
#define SE_Endurance_Absorb_Pct_Damage 521 //
|
#define SE_Endurance_Absorb_Pct_Damage 521 // implemented -
|
||||||
#define SE_Instant_Mana_Pct 522 //
|
#define SE_Instant_Mana_Pct 522 // implemented -
|
||||||
#define SE_Instant_Endurance_Pct 523 //
|
#define SE_Instant_Endurance_Pct 523 // implemented -
|
||||||
#define SE_Duration_HP_Pct 524 //
|
#define SE_Duration_HP_Pct 524 // implemented -
|
||||||
#define SE_Duration_Mana_Pct 525 //
|
#define SE_Duration_Mana_Pct 525 // implemented -
|
||||||
#define SE_Duration_Endurance_Pct 526 //
|
#define SE_Duration_Endurance_Pct 526 // implemented -
|
||||||
|
|
||||||
|
|
||||||
// LAST
|
// LAST
|
||||||
|
|||||||
+13
-3
@@ -190,8 +190,8 @@ int Mob::GetTotalToHit(EQ::skills::SkillType skill, int chance_mod)
|
|||||||
|
|
||||||
//518 Increase ATK accuracy by percentage, stackable
|
//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;
|
auto atkhit_bonus = itembonuses.Attack_Accuracy_Max_Percent + aabonuses.Attack_Accuracy_Max_Percent + spellbonuses.Attack_Accuracy_Max_Percent;
|
||||||
|
if (atkhit_bonus)
|
||||||
accuracy += (accuracy * atkhit_bonus) / 10000;
|
accuracy += round(static_cast<double>(accuracy) * static_cast<double>(atkhit_bonus) * 0.0001);
|
||||||
|
|
||||||
// 216 Melee Accuracy Amt aka SE_Accuracy -- flat bonus
|
// 216 Melee Accuracy Amt aka SE_Accuracy -- flat bonus
|
||||||
accuracy += itembonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1] +
|
accuracy += itembonuses.Accuracy[EQ::skills::HIGHEST_SKILL + 1] +
|
||||||
@@ -238,6 +238,11 @@ int Mob::compute_defense()
|
|||||||
if (IsClient())
|
if (IsClient())
|
||||||
defense += CastToClient()->GetHeroicAGI() / 10;
|
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
|
defense += itembonuses.AvoidMeleeChance; // item mod2
|
||||||
if (IsNPC())
|
if (IsNPC())
|
||||||
defense += CastToNPC()->GetAvoidanceRating();
|
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
|
auto evasion_bonus = spellbonuses.AvoidMeleeChanceEffect; // we check this first since it has a special case
|
||||||
if (evasion_bonus >= 10000)
|
if (evasion_bonus >= 10000)
|
||||||
return -1;
|
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
|
// 172 Evasion aka SE_AvoidMeleeChance
|
||||||
evasion_bonus += itembonuses.AvoidMeleeChanceEffect + aabonuses.AvoidMeleeChanceEffect; // item bonus here isn't mod2 avoidance
|
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;
|
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: {
|
case SE_CriticalSpellChance: {
|
||||||
newbon->CriticalSpellChance += base1;
|
newbon->CriticalSpellChance += base1;
|
||||||
|
|
||||||
@@ -1491,6 +1504,14 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon)
|
|||||||
newbon->Attack_Accuracy_Max_Percent += base1;
|
newbon->Attack_Accuracy_Max_Percent += base1;
|
||||||
break;
|
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
|
// to do
|
||||||
case SE_PetDiscipline:
|
case SE_PetDiscipline:
|
||||||
break;
|
break;
|
||||||
@@ -2489,6 +2510,20 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne
|
|||||||
break;
|
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:
|
case SE_ReduceSkillTimer:
|
||||||
{
|
{
|
||||||
if(new_bonus->SkillReuseTime[base2] < effect_value)
|
if(new_bonus->SkillReuseTime[base2] < effect_value)
|
||||||
@@ -3267,6 +3302,17 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne
|
|||||||
new_bonus->Attack_Accuracy_Max_Percent += effect_value;
|
new_bonus->Attack_Accuracy_Max_Percent += effect_value;
|
||||||
break;
|
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
|
//Special custom cases for loading effects on to NPC from 'npc_spels_effects' table
|
||||||
if (IsAISpellEffect) {
|
if (IsAISpellEffect) {
|
||||||
|
|
||||||
@@ -4274,6 +4320,17 @@ void Mob::NegateSpellsBonuses(uint16 spell_id)
|
|||||||
break;
|
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:
|
case SE_SkillDamageAmount:
|
||||||
{
|
{
|
||||||
for (int e = 0; e < EQ::skills::HIGHEST_SKILL + 1; e++)
|
for (int e = 0; e < EQ::skills::HIGHEST_SKILL + 1; e++)
|
||||||
@@ -4790,6 +4847,25 @@ void Mob::NegateSpellsBonuses(uint16 spell_id)
|
|||||||
aabonuses.IllusionPersistence = false;
|
aabonuses.IllusionPersistence = false;
|
||||||
break;
|
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:{
|
case SE_SkillProcSuccess:{
|
||||||
for(int e = 0; e < MAX_SKILL_PROCS; e++)
|
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 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
|
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 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 SkillReuseTime[EQ::skills::HIGHEST_SKILL + 1]; // Reduces skill timers
|
||||||
int32 SkillDamageAmount[EQ::skills::HIGHEST_SKILL + 2]; // All Skills + -1
|
int32 SkillDamageAmount[EQ::skills::HIGHEST_SKILL + 2]; // All Skills + -1
|
||||||
int32 TwoHandBluntBlock; // chance to block when wielding two hand blunt weapon
|
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_Rampage[2]; // 0= % chance to rampage, 1=damage modifier
|
||||||
uint32 PC_Pet_Flurry; // Percent chance flurry from double attack
|
uint32 PC_Pet_Flurry; // Percent chance flurry from double attack
|
||||||
int32 Attack_Accuracy_Max_Percent; // Increase ATK accuracy by percent.
|
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
|
// AAs
|
||||||
int8 Packrat; //weight reduction for items, 1 point = 10%
|
int8 Packrat; //weight reduction for items, 1 point = 10%
|
||||||
|
|||||||
+5
-2
@@ -4624,10 +4624,13 @@ int16 Mob::GetCritDmgMod(uint16 skill)
|
|||||||
{
|
{
|
||||||
int critDmg_mod = 0;
|
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] +
|
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];
|
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;
|
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_Mana_Pct:
|
||||||
case SE_Duration_Endurance_Pct:
|
case SE_Duration_Endurance_Pct:
|
||||||
case SE_Endurance_Absorb_Pct_Damage:
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user