mirror of
https://github.com/EQEmu/Server.git
synced 2026-05-16 22:58:34 +00:00
[Feature] New SPAs pass 1 (#1454)
* Implemented SPA Duration Pct Implemented new spell effects SE_Duration_HP_Pct 524 SE_Duration_Mana_Pct 525 SE_Duration_Endurance_Pct 526 Consumes 'base1' % of your maximum health/mana/endurance every 6 seconds. 'max' is maximum amount that can be consumed per tic. Additional Functionality Can be used as a heal/gain % by setting the base1 value to a positive. * Implemented SPA Instant Mana/End pct Fixes for SPA 524-526 Implemented SE_Instant_Mana_Pct 522 SE_Instant_Endurance_Pct 523 Extracts 'base1' percent of your maximum mana/endurance, or 'max', whichever is lower. * Implemented: SPA 521 EndAbsorbPctDmg Implemented SE_Endurance_Absorb_Pct_Damage 521 Absorb Damage using Endurance: base1 % (base2 End per 1 HP) Note: Both base1 and base2 need to be divided by 100 for actually value * Implemented SE_HealthTransfer 509 Implemented SE_Health_Transfer 509 'life burn' Consume base2 % of Hit Points to Damage for base % of Hit Points Can be used for heal Act of Valor * 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 * Implemented SPA 503 , 505 SE_Melee_Damage_Position_Mod 503 define SE_Damage_Taken_Position_Mod 505 SPA 503 increase/decreases melee damage by percent base1 based on your position base2 0=back 1=front SPA 504 increase/decreases melee damage taken by percent base1 based on your position base2 0=back 1=front * Implemented 467,468 Implemented SE_DS_Mitigation_Amount 467 SE_DS_Mitigation_Percentage 468 Reduce incoming DS by amt or percentage. base1 is value, if a reduction is desired it should be set to negative for both. * Fixes Formula fixes * Update spdat.h Added spa descriptions. * Fixes for PR removed debug shouts fixed description issue
This commit is contained in:
+213
-5
@@ -978,6 +978,9 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon)
|
||||
case SE_FrontalBackstabChance:
|
||||
newbon->FrontalBackstabChance += base1;
|
||||
break;
|
||||
case SE_Double_Backstab_Front:
|
||||
newbon->Double_Backstab_Front += base1;
|
||||
break;
|
||||
case SE_BlockBehind:
|
||||
newbon->BlockBehind += base1;
|
||||
break;
|
||||
@@ -1102,6 +1105,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;
|
||||
|
||||
@@ -1487,6 +1503,50 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon)
|
||||
}
|
||||
break;
|
||||
|
||||
case SE_Attack_Accuracy_Max_Percent:
|
||||
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;
|
||||
|
||||
case SE_Damage_Taken_Position_Mod:
|
||||
{
|
||||
//Mitigate if damage taken from behind base2 = 0, from front base2 = 1
|
||||
if (base2 < 0 || base2 > 2)
|
||||
break;
|
||||
else if (base1 < 0 && newbon->Damage_Taken_Position_Mod[base2] > base1)
|
||||
newbon->Damage_Taken_Position_Mod[base2] = base1;
|
||||
else if (base1 > 0 && newbon->Damage_Taken_Position_Mod[base2] < base1)
|
||||
newbon->Damage_Taken_Position_Mod[base2] = base1;
|
||||
break;
|
||||
}
|
||||
|
||||
case SE_Melee_Damage_Position_Mod:
|
||||
{
|
||||
if (base2 < 0 || base2 > 2)
|
||||
break;
|
||||
else if (base1 < 0 && newbon->Melee_Damage_Position_Mod[base2] > base1)
|
||||
newbon->Melee_Damage_Position_Mod[base2] = base1;
|
||||
else if (base1 > 0 && newbon->Melee_Damage_Position_Mod[base2] < base1)
|
||||
newbon->Melee_Damage_Position_Mod[base2] = base1;
|
||||
break;
|
||||
}
|
||||
|
||||
case SE_DS_Mitigation_Amount:
|
||||
newbon->DS_Mitigation_Amount += base1;
|
||||
break;
|
||||
|
||||
case SE_DS_Mitigation_Percentage:
|
||||
newbon->DS_Mitigation_Percentage += base1;
|
||||
break;
|
||||
|
||||
|
||||
// to do
|
||||
case SE_PetDiscipline:
|
||||
break;
|
||||
@@ -2485,6 +2545,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)
|
||||
@@ -2690,9 +2764,17 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne
|
||||
|
||||
case SE_ManaAbsorbPercentDamage:
|
||||
{
|
||||
if (new_bonus->ManaAbsorbPercentDamage[0] < effect_value){
|
||||
new_bonus->ManaAbsorbPercentDamage[0] = effect_value;
|
||||
new_bonus->ManaAbsorbPercentDamage[1] = buffslot;
|
||||
if (new_bonus->ManaAbsorbPercentDamage < effect_value){
|
||||
new_bonus->ManaAbsorbPercentDamage = effect_value;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case SE_Endurance_Absorb_Pct_Damage:
|
||||
{
|
||||
if (new_bonus->EnduranceAbsorbPercentDamage[0] < effect_value) {
|
||||
new_bonus->EnduranceAbsorbPercentDamage[0] = effect_value;
|
||||
new_bonus->EnduranceAbsorbPercentDamage[1] = base2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -2762,6 +2844,10 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne
|
||||
new_bonus->FrontalBackstabChance += effect_value;
|
||||
break;
|
||||
|
||||
case SE_Double_Backstab_Front:
|
||||
new_bonus->Double_Backstab_Front += effect_value;
|
||||
break;
|
||||
|
||||
case SE_ConsumeProjectile:
|
||||
new_bonus->ConsumeProjectile += effect_value;
|
||||
break;
|
||||
@@ -3250,6 +3336,57 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne
|
||||
if (new_bonus->trap_slots < effect_value)
|
||||
new_bonus->trap_slots = effect_value;
|
||||
break;
|
||||
|
||||
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;
|
||||
|
||||
case SE_Damage_Taken_Position_Mod:
|
||||
{
|
||||
//Mitigate if damage taken from behind base2 = 0, from front base2 = 1
|
||||
if (base2 < 0 || base2 > 2)
|
||||
break;
|
||||
if (AdditiveWornBonus)
|
||||
new_bonus->Damage_Taken_Position_Mod[base2] += effect_value;
|
||||
else if (effect_value < 0 && new_bonus->Damage_Taken_Position_Mod[base2] > effect_value)
|
||||
new_bonus->Damage_Taken_Position_Mod[base2] = effect_value;
|
||||
else if (effect_value > 0 && new_bonus->Damage_Taken_Position_Mod[base2] < effect_value)
|
||||
new_bonus->Damage_Taken_Position_Mod[base2] = effect_value;
|
||||
break;
|
||||
}
|
||||
|
||||
case SE_Melee_Damage_Position_Mod:
|
||||
{
|
||||
//Increase damage by percent from behind base2 = 0, from front base2 = 1
|
||||
if (base2 < 0 || base2 > 2)
|
||||
break;
|
||||
if (AdditiveWornBonus)
|
||||
new_bonus->Melee_Damage_Position_Mod[base2] += effect_value;
|
||||
else if (effect_value < 0 && new_bonus->Melee_Damage_Position_Mod[base2] > effect_value)
|
||||
new_bonus->Melee_Damage_Position_Mod[base2] = effect_value;
|
||||
else if (effect_value > 0 && new_bonus->Melee_Damage_Position_Mod[base2] < effect_value)
|
||||
new_bonus->Melee_Damage_Position_Mod[base2] = effect_value;
|
||||
break;
|
||||
}
|
||||
|
||||
case SE_DS_Mitigation_Amount:
|
||||
new_bonus->DS_Mitigation_Amount += effect_value;
|
||||
break;
|
||||
|
||||
case SE_DS_Mitigation_Percentage:
|
||||
new_bonus->DS_Mitigation_Percentage += effect_value;
|
||||
break;
|
||||
|
||||
|
||||
|
||||
//Special custom cases for loading effects on to NPC from 'npc_spels_effects' table
|
||||
if (IsAISpellEffect) {
|
||||
@@ -4258,6 +4395,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++)
|
||||
@@ -4353,8 +4501,12 @@ void Mob::NegateSpellsBonuses(uint16 spell_id)
|
||||
break;
|
||||
|
||||
case SE_ManaAbsorbPercentDamage:
|
||||
spellbonuses.ManaAbsorbPercentDamage[0] = effect_value;
|
||||
spellbonuses.ManaAbsorbPercentDamage[1] = -1;
|
||||
spellbonuses.ManaAbsorbPercentDamage = effect_value;
|
||||
break;
|
||||
|
||||
case SE_Endurance_Absorb_Pct_Damage:
|
||||
spellbonuses.EnduranceAbsorbPercentDamage[0] = effect_value;
|
||||
spellbonuses.EnduranceAbsorbPercentDamage[1] = effect_value;
|
||||
break;
|
||||
|
||||
case SE_ShieldBlock:
|
||||
@@ -4428,6 +4580,12 @@ void Mob::NegateSpellsBonuses(uint16 spell_id)
|
||||
itembonuses.FrontalBackstabChance = effect_value;
|
||||
break;
|
||||
|
||||
case SE_Double_Backstab_Front:
|
||||
spellbonuses.Double_Backstab_Front = effect_value;
|
||||
aabonuses.Double_Backstab_Front = effect_value;
|
||||
itembonuses.Double_Backstab_Front = effect_value;
|
||||
break;
|
||||
|
||||
case SE_ConsumeProjectile:
|
||||
spellbonuses.ConsumeProjectile = effect_value;
|
||||
aabonuses.ConsumeProjectile = effect_value;
|
||||
@@ -4770,6 +4928,56 @@ 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_Melee_Damage_Position_Mod:
|
||||
spellbonuses.Melee_Damage_Position_Mod[0] = effect_value;
|
||||
aabonuses.Melee_Damage_Position_Mod[0] = effect_value;
|
||||
itembonuses.Melee_Damage_Position_Mod[0] = effect_value;
|
||||
spellbonuses.Melee_Damage_Position_Mod[1] = effect_value;
|
||||
aabonuses.Melee_Damage_Position_Mod[1] = effect_value;
|
||||
itembonuses.Melee_Damage_Position_Mod[1] = effect_value;
|
||||
break;
|
||||
|
||||
case SE_Damage_Taken_Position_Mod:
|
||||
spellbonuses.Damage_Taken_Position_Mod[0] = effect_value;
|
||||
aabonuses.Damage_Taken_Position_Mod[0] = effect_value;
|
||||
itembonuses.Damage_Taken_Position_Mod[0] = effect_value;
|
||||
spellbonuses.Damage_Taken_Position_Mod[1] = effect_value;
|
||||
aabonuses.Damage_Taken_Position_Mod[1] = effect_value;
|
||||
itembonuses.Damage_Taken_Position_Mod[1] = effect_value;
|
||||
break;
|
||||
|
||||
|
||||
case SE_DS_Mitigation_Amount:
|
||||
spellbonuses.DS_Mitigation_Amount = effect_value;
|
||||
itembonuses.DS_Mitigation_Amount = effect_value;
|
||||
aabonuses.DS_Mitigation_Amount = effect_value;
|
||||
break;
|
||||
|
||||
case SE_DS_Mitigation_Percentage:
|
||||
spellbonuses.DS_Mitigation_Percentage = effect_value;
|
||||
itembonuses.DS_Mitigation_Percentage = effect_value;
|
||||
aabonuses.DS_Mitigation_Percentage = effect_value;
|
||||
break;
|
||||
|
||||
case SE_SkillProcSuccess:{
|
||||
for(int e = 0; e < MAX_SKILL_PROCS; e++)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user