From b10b161bb95fcbd6cee1177c72c75a938c9675df Mon Sep 17 00:00:00 2001 From: megamage Date: Tue, 25 Nov 2008 19:14:55 -0600 Subject: *Update weapon damage spell calculations. *Fix devastate. --HG-- branch : trunk --- src/game/SpellEffects.cpp | 69 ++++++++++++++++++++++++++++++++--------------- src/game/SpellMgr.h | 1 + 2 files changed, 49 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index 248171600b6..acbdfacdce9 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -4258,13 +4258,13 @@ void Spell::EffectWeaponDmg(uint32 i) } // some spell specific modifiers - bool customBonusDamagePercentMod = false; - float bonusDamagePercentMod = 1.0f; // applied to fixed effect damage bonus if set customBonusDamagePercentMod + //bool customBonusDamagePercentMod = false; + //float bonusDamagePercentMod = 1.0f; // applied to fixed effect damage bonus if set customBonusDamagePercentMod float weaponDamagePercentMod = 1.0f; // applied to weapon damage (and to fixed effect damage bonus if customBonusDamagePercentMod not set float totalDamagePercentMod = 1.0f; // applied to final bonus+weapon damage bool normalized = false; - int32 spell_bonus = 0; // bonus specific for spell + switch(m_spellInfo->SpellFamilyName) { case SPELLFAMILY_WARRIOR: @@ -4278,19 +4278,52 @@ void Spell::EffectWeaponDmg(uint32 i) // Devastate bonus and sunder armor refresh else if(m_spellInfo->SpellVisual == 671 && m_spellInfo->SpellIconID == 1508) { - customBonusDamagePercentMod = true; - bonusDamagePercentMod = 0.0f; // only applied if auras found + uint32 stack = 0; Unit::AuraList const& list = unitTarget->GetAurasByType(SPELL_AURA_MOD_RESISTANCE); for(Unit::AuraList::const_iterator itr=list.begin();itr!=list.end();++itr) { SpellEntry const *proto = (*itr)->GetSpellProto(); - if(proto->SpellVisual == 406 && proto->SpellIconID == 565) + if(proto->SpellFamilyName == SPELLFAMILY_WARRIOR + && proto->SpellFamilyFlags == SPELLFAMILYFLAG_WARRIOR_SUNDERARMOR) { int32 duration = GetSpellDuration(proto); (*itr)->SetAuraDuration(duration); (*itr)->UpdateAuraDuration(); - bonusDamagePercentMod += 1.0f; // +100% + ++stack; + } + } + + for(int j = 0; j < 3; j++) + { + if(m_spellInfo->Effect[j] == SPELL_EFFECT_NORMALIZED_WEAPON_DMG) + { + spell_bonus += (stack - 1) * CalculateDamage(j, unitTarget); + break; + } + } + + if(stack < 5) + { + // get highest rank of the Sunder Armor spell + const PlayerSpellMap& sp_list = ((Player*)m_caster)->GetSpellMap(); + for (PlayerSpellMap::const_iterator itr = sp_list.begin(); itr != sp_list.end(); ++itr) + { + // only highest rank is shown in spell book, so simply check if shown in spell book + if(!itr->second->active || itr->second->disabled || itr->second->state == PLAYERSPELL_REMOVED) + continue; + + SpellEntry const *spellInfo = sSpellStore.LookupEntry(itr->first); + if (!spellInfo) + continue; + + if (spellInfo->SpellFamilyFlags == SPELLFAMILYFLAG_WARRIOR_SUNDERARMOR + && spellInfo->Id != m_spellInfo->Id + && spellInfo->SpellFamilyName == SPELLFAMILY_WARRIOR) + { + m_caster->CastSpell(unitTarget, spellInfo, true); + break; + } } } } @@ -4299,13 +4332,13 @@ void Spell::EffectWeaponDmg(uint32 i) case SPELLFAMILY_ROGUE: { // Ambush - if(m_spellInfo->SpellFamilyFlags & 0x00000200LL) + /*if(m_spellInfo->SpellFamilyFlags & 0x00000200LL) { customBonusDamagePercentMod = true; bonusDamagePercentMod = 2.5f; // 250% - } + }*/ // Mutilate (for each hand) - else if(m_spellInfo->SpellFamilyFlags & 0x600000000LL) + if(m_spellInfo->SpellFamilyFlags & 0x600000000LL) { bool found = false; // fast check @@ -4360,35 +4393,29 @@ void Spell::EffectWeaponDmg(uint32 i) } } - int32 fixed_bonus = 0; for (int j = 0; j < 3; j++) { switch(m_spellInfo->Effect[j]) { case SPELL_EFFECT_WEAPON_DAMAGE: case SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL: - fixed_bonus += CalculateDamage(j,unitTarget); + spell_bonus += CalculateDamage(j,unitTarget); break; case SPELL_EFFECT_NORMALIZED_WEAPON_DMG: - fixed_bonus += CalculateDamage(j,unitTarget); + spell_bonus += CalculateDamage(j,unitTarget); normalized = true; break; case SPELL_EFFECT_WEAPON_PERCENT_DAMAGE: weaponDamagePercentMod *= float(CalculateDamage(j,unitTarget)) / 100.0f; - - // applied only to prev.effects fixed damage - if(customBonusDamagePercentMod) - fixed_bonus = int32(fixed_bonus*bonusDamagePercentMod); - else - fixed_bonus = int32(fixed_bonus*weaponDamagePercentMod); - break; default: break; // not weapon damage effect, just skip } } + //fixed_bonus = int32(fixed_bonus*weaponDamagePercentMod); + // non-weapon damage - int32 bonus = spell_bonus + fixed_bonus; + int32 bonus = spell_bonus;// + fixed_bonus; // apply to non-weapon bonus weapon total pct effect, weapon total flat effect included in weapon damage if(bonus) diff --git a/src/game/SpellMgr.h b/src/game/SpellMgr.h index 6e3c5c3ddff..859329a96f2 100644 --- a/src/game/SpellMgr.h +++ b/src/game/SpellMgr.h @@ -241,6 +241,7 @@ enum SpellDisableTypes #define SPELLFAMILYFLAG_ROGUE_FEINT 0x008000000LL #define SPELLFAMILYFLAG_ROGUE_KIDNEYSHOT 0x000200000LL #define SPELLFAMILYFLAG_ROGUE__FINISHING_MOVE 0x9003E0000LL +#define SPELLFAMILYFLAG_WARRIOR_SUNDERARMOR 0x000004000LL // Spell clasification enum SpellSpecific -- cgit v1.2.3