diff --git a/common/spdat.h b/common/spdat.h index 5d21dff00..e93cb1121 100644 --- a/common/spdat.h +++ b/common/spdat.h @@ -825,8 +825,8 @@ typedef enum { //#define SE_Ff_Value_Max 480 // //#define SE_Fc_Cast_Spell_On_Land 481 // //#define SE_Skill_Base_Damage_Mod 482 // -#define SE_Fc_Spell_Damage_Pct_IncomingPC 483 // -//#define SE_Fc_Spell_Damage_Amt_IncomingPC 484 // +#define SE_Fc_Spell_Damage_Pct_IncomingPC 483 // Implemented - modifies incoming spell damage by percent +#define SE_Fc_Spell_Damage_Amt_IncomingPC 484 // Implemented - modifies incoming spell damage by flat amount. Typically adds damage to incoming spells. //#define SE_Ff_CasterClass 485 // //#define SE_Ff_Same_Caster 486 // //#define SE_Extend_Tradeskill_Cap 487 // diff --git a/zone/bonuses.cpp b/zone/bonuses.cpp index caad39302..ec9ddafb1 100644 --- a/zone/bonuses.cpp +++ b/zone/bonuses.cpp @@ -3755,6 +3755,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: diff --git a/zone/common.h b/zone/common.h index 127b07941..c95a750db 100644 --- a/zone/common.h +++ b/zone/common.h @@ -136,6 +136,7 @@ typedef enum { //focus types focusBlockNextSpell, focusFcHealPctIncoming, focusFcDamageAmtIncoming, + focusFcSpellDamageAmtIncomingPC, focusFcHealAmtIncoming, focusFcBaseEffects, focusIncreaseNumHits, diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index e96c62380..9eadeef14 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -3061,6 +3061,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove case SE_SkillDamageTaken: case SE_FcSpellVulnerability: case SE_Fc_Spell_Damage_Pct_IncomingPC: + case SE_Fc_Spell_Damage_Amt_IncomingPC: case SE_FcTwincast: case SE_DelayDeath: case SE_CastOnFadeEffect: @@ -4814,6 +4815,11 @@ int16 Client::CalcAAFocus(focusType type, const AA::Rank &rank, uint16 spell_id) value = base1; break; + case SE_Fc_Spell_Damage_Amt_IncomingPC: + if (type == focusFcSpellDamageAmtIncomingPC) + value = base1; + break; + case SE_FcHealAmtIncoming: if (type == focusFcHealAmtIncoming) value = base1; @@ -5343,6 +5349,11 @@ int16 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, boo value = focus_spell.base[i]; break; + case SE_Fc_Spell_Damage_Amt_IncomingPC: + if (type == focusFcSpellDamageAmtIncomingPC) + value = focus_spell.base[i]; + break; + case SE_FcHealAmtIncoming: if (type == focusFcHealAmtIncoming) value = focus_spell.base[i]; @@ -6328,6 +6339,7 @@ bool Mob::DoHPToManaCovert(uint16 mana_cost) int32 Mob::GetFcDamageAmtIncoming(Mob *caster, uint32 spell_id, bool use_skill, uint16 skill ) { //Used to check focus derived from SE_FcDamageAmtIncoming which adds direct damage to Spells or Skill based attacks. + //Used to check focus derived from SE_Fc_Spell_Damage_Amt_IncomingPC which adds direct damage to Spells. int32 dmg = 0; bool limit_exists = false; bool skill_found = false; @@ -6376,6 +6388,20 @@ int32 Mob::GetFcDamageAmtIncoming(Mob *caster, uint32 spell_id, bool use_skill, } } } + if (spellbonuses.FocusEffects[focusFcSpellDamageAmtIncomingPC]) { + int buff_count = GetMaxTotalSlots(); + for (int i = 0; i < buff_count; i++) { + + if ((IsValidSpell(buffs[i].spellid) && (IsEffectInSpell(buffs[i].spellid, SE_FcDamageAmtIncoming)))) { + + int32 focus = caster->CalcFocusEffect(focusFcSpellDamageAmtIncomingPC, buffs[i].spellid, spell_id); + if (focus) { + dmg += focus; + CheckNumHitsRemaining(NumHit::MatchingSpells, i); + } + } + } + } return dmg; }