Here is the code for spell and dot shielding separated out... Spell effect coming later.
mob.h
Code:
Index: mob.h
===================================================================
--- mob.h (revision 1597)
+++ mob.h (working copy)
@@ -839,7 +839,7 @@
inline int16 GetErrorNumber() const {return adverrorinfo;}
sint32 ReduceDamage(sint32 damage);
- sint32 ReduceMagicalDamage(sint32 damage);
+ sint32 AffectMagicalDamage(sint32 damage, int16 spell_id, const bool iBuffTic, Mob* attacker);
virtual void DoSpecialAttackDamage(Mob *who, SkillType skill, sint32 max_damage, sint32 min_damage = 1, sint32 hate_override = -1);
bool Flurry();
attack.cpp
Code:
Index: attack.cpp
===================================================================
--- attack.cpp (revision 1597)
+++ attack.cpp (working copy)
@@ -2929,13 +2929,14 @@
return(damage);
}
-sint32 Mob::ReduceMagicalDamage(sint32 damage)
+sint32 Mob::AffectMagicalDamage(sint32 damage, int16 spell_id, const bool iBuffTic, Mob* attacker)
{
- if(damage <= 0 || (!HasSpellRune() && !HasPartialSpellRune()))
+ if(damage <= 0)
{
return damage;
}
+ // See if we block the spell outright first
int slot = GetBuffSlotFromType(SE_NegateAttacks);
if(slot >= 0 && buffs[slot].magic_rune > 0)
{
@@ -2946,55 +2947,67 @@
}
return -6;
}
-
- slot = GetBuffSlotFromType(SE_MitigateSpellDamage);
- if(slot >= 0)
+
+ // If this is a DoT, use DoT Shielding...
+ if(iBuffTic)
{
- int damage_to_reduce = damage * GetPartialMagicRuneReduction(buffs[slot].spellid) / 100;
- if(damage_to_reduce > buffs[slot].magic_rune)
+ damage -= (damage * this->itembonuses.DoTShielding / 100);
+ }
+ // This must be a DD then so lets apply Spell Shielding and runes.
+ else
+ {
+ // Reduce damage by the Spell Shielding first so that the runes don't take the raw damage.
+ damage -= (damage * this->itembonuses.SpellDamageShield / 100);
+
+ // Do runes now.
+ slot = GetBuffSlotFromType(SE_MitigateSpellDamage);
+ if(slot >= 0)
{
- mlog(SPELLS__EFFECT_VALUES, "Mob::ReduceDamage SE_MitigateSpellDamage %d damage negated, %d"
- " damage remaining, fading buff.", damage_to_reduce, buffs[slot].magic_rune);
- damage -= damage_to_reduce;
- BuffFadeBySlot(slot);
- UpdateRuneFlags();
+ int damage_to_reduce = damage * GetPartialMagicRuneReduction(buffs[slot].spellid) / 100;
+ if(damage_to_reduce > buffs[slot].magic_rune)
+ {
+ mlog(SPELLS__EFFECT_VALUES, "Mob::ReduceDamage SE_MitigateSpellDamage %d damage negated, %d"
+ " damage remaining, fading buff.", damage_to_reduce, buffs[slot].magic_rune);
+ damage -= damage_to_reduce;
+ BuffFadeBySlot(slot);
+ UpdateRuneFlags();
+ }
+ else
+ {
+ mlog(SPELLS__EFFECT_VALUES, "Mob::ReduceDamage SE_MitigateMeleeDamage %d damage negated, %d"
+ " damage remaining.", damage_to_reduce, buffs[slot].magic_rune);
+ buffs[slot].magic_rune = (buffs[slot].magic_rune - damage_to_reduce);
+ damage -= damage_to_reduce;
+ }
}
- else
+
+ if(damage < 1)
{
- mlog(SPELLS__EFFECT_VALUES, "Mob::ReduceDamage SE_MitigateMeleeDamage %d damage negated, %d"
- " damage remaining.", damage_to_reduce, buffs[slot].magic_rune);
- buffs[slot].magic_rune = (buffs[slot].magic_rune - damage_to_reduce);
- damage -= damage_to_reduce;
+ return -6;
}
- }
- if(damage < 1)
- {
- return -6;
- }
-
- slot = GetBuffSlotFromType(SE_AbsorbMagicAtt);
- while(slot >= 0)
- {
- int16 magic_rune_left = buffs[slot].magic_rune;
- if(magic_rune_left >= damage)
+ slot = GetBuffSlotFromType(SE_AbsorbMagicAtt);
+ while(slot >= 0)
{
- magic_rune_left -= damage;
- damage = 0;
- buffs[slot].magic_rune = magic_rune_left;
- break;
+ int16 magic_rune_left = buffs[slot].magic_rune;
+ if(magic_rune_left >= damage)
+ {
+ magic_rune_left -= damage;
+ damage = 0;
+ buffs[slot].magic_rune = magic_rune_left;
+ break;
+ }
+ else
+ {
+ if(magic_rune_left > 0)
+ damage -= magic_rune_left;
+ BuffFadeBySlot(slot);
+ slot = GetBuffSlotFromType(SE_AbsorbMagicAtt);
+ UpdateRuneFlags();
+ }
}
- else
- {
- if(magic_rune_left > 0)
- damage -= magic_rune_left;
- BuffFadeBySlot(slot);
- slot = GetBuffSlotFromType(SE_AbsorbMagicAtt);
- UpdateRuneFlags();
- }
}
-
- return(damage);
+ return damage;
}
bool Mob::HasProcs() const
@@ -3159,7 +3172,7 @@
mlog(COMBAT__HITS, "Melee Damage reduced to %d", damage);
} else {
sint32 origdmg = damage;
- damage = ReduceMagicalDamage(damage);
+ damage = AffectMagicalDamage(damage, spell_id, iBuffTic, attacker);
mlog(COMBAT__HITS, "Melee Damage reduced to %d", damage);
if (origdmg != damage && attacker && attacker->IsClient()) {
if(attacker->CastToClient()->GetFilter(FILTER_DAMAGESHIELD) != FilterHide)