[Feature] New SPAs pass 2 (#1459)

* 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.

* Implemented SPA 469, 470

Implemented
SE_Chance_Best_in_Spell_Grp     469  Chance to cast highest scribed spell within a spell group. All base2 spells share roll chance, only 1 cast.

SE_Trigger_Best_in_Spell_Grp	470

Chance to cast highest scribed spell within a spell group. Each spell has own chance.

Additional Changes:
Rewrote TrySpellTrigger function used for SPA 340 since it incorporates SPA 469. Improved code so that chance of spell being triggered should be more accurate statistically.

* Implemented SPA 474, 494

Implemented
 SE_Pet_Crit_Melee_Damage_Pct_Owner	474 - Gives pets a critical melee damage modifier from the owner

SE_Pet_Add_Atk	494 - Gives pet a ATK bonus from the owner

Fixed SE_PetMeleeMitigation 397 - The bonus was not being calculated

* Implemented SPA 465,477,478

Implemented

SE_PC_Pet_AE_Rampage			465
Chance for pet to AE rampage with a damage modifier

SE_Hatelist_To_Top_Index		477
Chance to be put on top of RAMPAGE list

SE_Hatelist_To_Tail_Index		478
Chance to be put on bottom of RAMPAGE list

* Implemented

Implemented

SE_Fearstun 	502
Stun with a max level limit. Normal stun restrictions don't apply. Base1 duration, base2 PC duration, max is level limit

SE_TwinCastBlocker 39
Previously unused spell effect that is now used on live. Simply, if this effect is present in a spell then the spell can not be twin cast.

* Implemented SPA 483

Implemented
Fc_Spell_Damage_Pct_IncomingPC	483
- Focus effect that modifies iby percent incoming spell damage on the target.
Base1= min Base2= max. Final percent is random between max and min each time focus is applied from a spell cast.

Note: Written to stack with similar functioning focus SPA 269 SE_FcSpellVulnerability.

* Implemented SPA 484

Implemented

SE_Fc_Spell_Damage_Amt_IncomingPC	484 // focus effect that modifies incoming spell damage by flat amount. Consider it a debuff that adds damage to incoming spells. Positive value to add additional damage.

* Implemented SPA 481, 485,486,512

Implemented

SE_Fc_Cast_Spell_On_Land 481
Focus effect that is checked when a spell is cast on a target, if target has this focus effect and all limiting criteria are met, then the target will cast a spell as specified by the focus. Can be given a roll chance for success. Base1=Chance, Base2=Spellid

Note: This spell has a huge amount of potential applications. See 'Alliance' type spells on live. (ie live spell 50247)

Implemented associated focus limits seen in live spells.

SE_Ff_CasterClass	485
- Caster of spell on target with a focus effect that is checked by incoming spells must be specified class or classes.

SE_Ff_Same_Caster	 486 -Caster of spell on target with a focus effect that is checked by incoming spells 0=Must be different caster 1=Must be same caster

The following is an associated effect seen with SPA 481

SE_Proc_Timer_Modifier 			512
This provides a way to rate limit the amount of spell triggers generated by SPA 481. For example after 1 successful spell trigger no additional spells can be triggered for 1.5 seconds. Ie. Base=1 and Base2 1500.
Written in a flexible format to allow scaling of multiple different buffs with this effect at same time.

* Stacking fixes for new effects

Stacking fixes for new effects.

* merge with upstream master

merge and update up spdat.h

* Update spdat.h

* Fix for bolt spell targeting self if target zone/died while casting.

Fix for bolt spell targeting self if target zone/died while casting. Despite the name being "ST_TargetOptional", this target type is reserved for projectile spells which all require a target, thus should be treated like any other targeted spell.
This commit is contained in:
KayenEQ
2021-07-20 11:06:20 -04:00
committed by GitHub
parent 8a2a1b152e
commit 2b74d71ff5
14 changed files with 766 additions and 139 deletions
+65
View File
@@ -1438,6 +1438,13 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon)
break;
}
case SE_PC_Pet_AE_Rampage: {
newbon->PC_Pet_AE_Rampage[0] += base1; //Chance to rampage
if (newbon->PC_Pet_AE_Rampage[1] < base2)
newbon->PC_Pet_AE_Rampage[1] = base2; //Damage modifer - take highest
break;
}
case SE_PC_Pet_Flurry_Chance:
newbon->PC_Pet_Flurry += base1; //Chance to Flurry
break;
@@ -1546,6 +1553,13 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon)
newbon->DS_Mitigation_Percentage += base1;
break;
case SE_Pet_Crit_Melee_Damage_Pct_Owner:
newbon->Pet_Crit_Melee_Damage_Pct_Owner += base1;
break;
case SE_Pet_Add_Atk:
newbon->Pet_Add_Atk += base1;
break;
// to do
case SE_PetDiscipline:
@@ -3282,6 +3296,13 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne
break;
}
case SE_PC_Pet_AE_Rampage: {
new_bonus->PC_Pet_AE_Rampage[0] += effect_value; //Chance to rampage
if (new_bonus->PC_Pet_AE_Rampage[1] < base2)
new_bonus->PC_Pet_AE_Rampage[1] = base2; //Damage modifer - take highest
break;
}
case SE_PC_Pet_Flurry_Chance:
new_bonus->PC_Pet_Flurry += effect_value; //Chance to Flurry
break;
@@ -3386,7 +3407,13 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne
new_bonus->DS_Mitigation_Percentage += effect_value;
break;
case SE_Pet_Crit_Melee_Damage_Pct_Owner:
new_bonus->Pet_Crit_Melee_Damage_Pct_Owner += effect_value;
break;
case SE_Pet_Add_Atk:
new_bonus->Pet_Add_Atk += effect_value;
break;
//Special custom cases for loading effects on to NPC from 'npc_spels_effects' table
if (IsAISpellEffect) {
@@ -3708,6 +3735,8 @@ uint8 Mob::IsFocusEffect(uint16 spell_id,int effect_index, bool AA,uint32 aa_eff
return 0; //This is calculated as an actual bonus
case SE_FcSpellVulnerability:
return focusSpellVulnerability;
case SE_Fc_Spell_Damage_Pct_IncomingPC:
return focusFcSpellDamagePctIncomingPC;
case SE_BlockNextSpellFocus:
//return focusBlockNextSpell;
return 0; //This is calculated as an actual bonus
@@ -3725,6 +3754,8 @@ uint8 Mob::IsFocusEffect(uint16 spell_id,int effect_index, bool AA,uint32 aa_eff
return focusFcDamagePctCrit;
case SE_FcDamageAmtIncoming:
return focusFcDamageAmtIncoming;
case SE_Fc_Spell_Damage_Amt_IncomingPC:
return focusFcSpellDamageAmtIncomingPC;
case SE_FcHealAmtIncoming:
return focusFcHealAmtIncoming;
case SE_FcHealPctIncoming:
@@ -3739,6 +3770,8 @@ uint8 Mob::IsFocusEffect(uint16 spell_id,int effect_index, bool AA,uint32 aa_eff
return focusFcMute;
case SE_FcTimerRefresh:
return focusFcTimerRefresh;
case SE_Fc_Cast_Spell_On_Land:
return focusFcCastSpellOnLand;
case SE_FcStunTimeMod:
return focusFcStunTimeMod;
case SE_FcHealPctCritIncoming:
@@ -3747,6 +3780,7 @@ uint8 Mob::IsFocusEffect(uint16 spell_id,int effect_index, bool AA,uint32 aa_eff
return focusFcHealAmt;
case SE_FcHealAmtCrit:
return focusFcHealAmtCrit;
}
return 0;
}
@@ -4978,6 +5012,37 @@ void Mob::NegateSpellsBonuses(uint16 spell_id)
aabonuses.DS_Mitigation_Percentage = effect_value;
break;
case SE_Pet_Crit_Melee_Damage_Pct_Owner:
spellbonuses.Pet_Crit_Melee_Damage_Pct_Owner = effect_value;
itembonuses.Pet_Crit_Melee_Damage_Pct_Owner = effect_value;
aabonuses.Pet_Crit_Melee_Damage_Pct_Owner = effect_value;
break;
case SE_Pet_Add_Atk:
spellbonuses.Pet_Add_Atk = effect_value;
itembonuses.Pet_Add_Atk = effect_value;
aabonuses.Pet_Add_Atk = effect_value;
break;
case SE_PC_Pet_Rampage:
spellbonuses.PC_Pet_Rampage[0] = effect_value;
itembonuses.PC_Pet_Rampage[0] = effect_value;
aabonuses.PC_Pet_Rampage[0] = effect_value;
spellbonuses.PC_Pet_Rampage[1] = effect_value;
itembonuses.PC_Pet_Rampage[1] = effect_value;
aabonuses.PC_Pet_Rampage[1] = effect_value;
break;
case SE_PC_Pet_AE_Rampage:
spellbonuses.PC_Pet_AE_Rampage[0] = effect_value;
itembonuses.PC_Pet_AE_Rampage[0] = effect_value;
aabonuses.PC_Pet_AE_Rampage[0] = effect_value;
spellbonuses.PC_Pet_AE_Rampage[1] = effect_value;
itembonuses.PC_Pet_AE_Rampage[1] = effect_value;
aabonuses.PC_Pet_AE_Rampage[1] = effect_value;
break;
case SE_SkillProcSuccess:{
for(int e = 0; e < MAX_SKILL_PROCS; e++)
{