diff --git a/sql/mangos_spell_check.sql b/sql/mangos_spell_check.sql index 37fceff9f..a2d4389bd 100644 --- a/sql/mangos_spell_check.sql +++ b/sql/mangos_spell_check.sql @@ -726,6 +726,7 @@ INSERT INTO spell_check (spellid,SpellFamilyName,SpellFamilyMaskA,SpellFamilyMas ( 0, 9,0x0000000100000000,0x00000000, -1, -1, -1, 2, -1,-1,'Steady Shot', 'Spell::EffectSchoolDMG'), ( 0, 9,0x0000000100000000,0x00000000, -1, -1, -1, 3, -1,-1,'Steady Shot', 'Spell::EffectDummy'), ( 0,-1, -1, -1,1989, -1, -1, -1, 42, 0,'Sudden Death', 'Spell::EffectDummy'), +( 0, 4,0x0000000000004000, -1, -1, -1, -1, -1,101, 0,'Sunder Armor', 'Spell::EffectDummy'), ( 0, 7, -1, -1, 961, -1, -1, -1,137,-1,'Survival of the Fittest', 'Aura::HandleShapeshiftBoosts'), ( 0, 7,0x0010000000000000,0x00000000, -1, -1, -1, 2, -1,-1,'Swipe', 'Spell::EffectSchoolDMG'), ( 0, 4,0x0000000000000080,0x00000000, -1, -1, -1, 2, -1,-1,'Thunder Clap', 'Spell::EffectSchoolDMG'), diff --git a/src/game/DBCEnums.h b/src/game/DBCEnums.h index f0a7bac46..dd5681224 100644 --- a/src/game/DBCEnums.h +++ b/src/game/DBCEnums.h @@ -432,6 +432,28 @@ enum SpellEffectIndex #define MAX_EFFECT_INDEX 3 +enum SpellFamily +{ + SPELLFAMILY_GENERIC = 0, + SPELLFAMILY_UNK1 = 1, // events, holidays + // 2 - unused + SPELLFAMILY_MAGE = 3, + SPELLFAMILY_WARRIOR = 4, + SPELLFAMILY_WARLOCK = 5, + SPELLFAMILY_PRIEST = 6, + SPELLFAMILY_DRUID = 7, + SPELLFAMILY_ROGUE = 8, + SPELLFAMILY_HUNTER = 9, + SPELLFAMILY_PALADIN = 10, + SPELLFAMILY_SHAMAN = 11, + SPELLFAMILY_UNK2 = 12, // 2 spells (silence resistance) + SPELLFAMILY_POTION = 13, + // 14 - unused + SPELLFAMILY_DEATHKNIGHT = 15, + // 16 - unused + SPELLFAMILY_PET = 17 +}; + enum VehicleFlags { VEHICLE_FLAG_ADJUST_AIM_ANGLE = 0x00000400, // Lua_IsVehicleAimAngleAdjustable diff --git a/src/game/DBCStructure.h b/src/game/DBCStructure.h index 2d3fb7848..d0b7becb7 100644 --- a/src/game/DBCStructure.h +++ b/src/game/DBCStructure.h @@ -1517,6 +1517,16 @@ struct SpellEntry return EffectSpellClassMaskA + effect * 3; } + bool IsFitToFamilyMask(uint64 familyFlags, uint32 familyFlags2 = 0) const + { + return (SpellFamilyFlags & familyFlags) || (SpellFamilyFlags2 & familyFlags2); + } + + bool IsFitToFamily(SpellFamily family, uint64 familyFlags, uint32 familyFlags2 = 0) const + { + return SpellFamily(SpellFamilyName) == family && IsFitToFamilyMask(familyFlags, familyFlags2); + } + private: // prevent creating custom entries (copy data from original in fact) SpellEntry(SpellEntry const&); // DON'T must have implementation diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index 15f4c3c90..568c2aafe 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -5263,30 +5263,22 @@ void Spell::EffectWeaponDmg(SpellEffectIndex eff_idx) } case SPELLFAMILY_WARRIOR: { - // Devastate bonus and sunder armor refresh + // Devastate if(m_spellInfo->SpellVisual[0] == 12295 && m_spellInfo->SpellIconID == 1508) { - uint32 stack = 0; - // Need refresh all Sunder Armor auras from this caster - Unit::SpellAuraHolderMap& suAuras = unitTarget->GetSpellAuraHolderMap(); - SpellEntry const *spellInfo; - for(Unit::SpellAuraHolderMap::iterator itr = suAuras.begin(); itr != suAuras.end(); ++itr) + // Sunder Armor + Aura* sunder = unitTarget->GetAura(SPELL_AURA_MOD_RESISTANCE_PCT, SPELLFAMILY_WARRIOR, UI64LIT(0x0000000000004000), 0x00000000, m_caster->GetObjectGuid()); + + // Devastate bonus and sunder armor refresh + if (sunder) { - spellInfo = (*itr).second->GetSpellProto(); - if( spellInfo->SpellFamilyName == SPELLFAMILY_WARRIOR && - (spellInfo->SpellFamilyFlags & UI64LIT(0x0000000000004000)) && - (*itr).second->GetCasterGUID() == m_caster->GetGUID()) - { - (*itr).second->RefreshHolder(); - stack = (*itr).second->GetStackAmount(); - break; - } + sunder->GetHolder()->RefreshHolder(); + spell_bonus += sunder->GetStackAmount() * CalculateDamage(EFFECT_INDEX_2, unitTarget); } - if (stack) - spell_bonus += stack * CalculateDamage(EFFECT_INDEX_2, unitTarget); - if (!stack || stack < spellInfo->StackAmount) - // Devastate causing Sunder Armor Effect - // and no need to cast over max stack amount + + // Devastate causing Sunder Armor Effect + // and no need to cast over max stack amount + if (!sunder || sunder->GetStackAmount() < sunder->GetSpellProto()->StackAmount) m_caster->CastSpell(unitTarget, 58567, true); } break; diff --git a/src/game/SpellMgr.h b/src/game/SpellMgr.h index 994dec016..1ab7cbad9 100644 --- a/src/game/SpellMgr.h +++ b/src/game/SpellMgr.h @@ -46,28 +46,6 @@ enum SpellCategories SPELLCATEGORY_JUDGEMENT = 1210, // Judgement (seal trigger) }; -enum SpellFamilyNames -{ - SPELLFAMILY_GENERIC = 0, - SPELLFAMILY_UNK1 = 1, // events, holidays - // 2 - unused - SPELLFAMILY_MAGE = 3, - SPELLFAMILY_WARRIOR = 4, - SPELLFAMILY_WARLOCK = 5, - SPELLFAMILY_PRIEST = 6, - SPELLFAMILY_DRUID = 7, - SPELLFAMILY_ROGUE = 8, - SPELLFAMILY_HUNTER = 9, - SPELLFAMILY_PALADIN = 10, - SPELLFAMILY_SHAMAN = 11, - SPELLFAMILY_UNK2 = 12, // 2 spells (silence resistance) - SPELLFAMILY_POTION = 13, - // 14 - unused - SPELLFAMILY_DEATHKNIGHT = 15, - // 16 - unused - SPELLFAMILY_PET = 17 -}; - //Some SpellFamilyFlags #define SPELLFAMILYFLAG_ROGUE_VANISH UI64LIT(0x0000000000000800) #define SPELLFAMILYFLAG_ROGUE_STEALTH UI64LIT(0x0000000000400000) diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index ba0a46c1e..e2b3205f3 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -4896,19 +4896,14 @@ Aura* Unit::GetAura(uint32 spellId, SpellEffectIndex effindex) return NULL; } -Aura* Unit::GetAura(AuraType type, uint32 family, uint64 familyFlag, uint32 familyFlag2, uint64 casterGUID) +Aura* Unit::GetAura(AuraType type, SpellFamily family, uint64 familyFlag, uint32 familyFlag2, ObjectGuid casterGuid) { AuraList const& auras = GetAurasByType(type); for(AuraList::const_iterator i = auras.begin();i != auras.end(); ++i) - { - SpellEntry const *spell = (*i)->GetSpellProto(); - if (spell->SpellFamilyName == family && (spell->SpellFamilyFlags & familyFlag || spell->SpellFamilyFlags2 & familyFlag2)) - { - if (casterGUID && (*i)->GetCasterGUID()!=casterGUID) - continue; - return (*i); - } - } + if ((*i)->GetSpellProto()->IsFitToFamily(family, familyFlag, familyFlag2) && + (casterGuid.IsEmpty() || (*i)->GetCasterGuid() == casterGuid)) + return *i; + return NULL; } diff --git a/src/game/Unit.h b/src/game/Unit.h index d875db5be..dfea27e0d 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -1760,7 +1760,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject uint8 GetVisibleAurasCount() { return m_visibleAuras.size(); } Aura* GetAura(uint32 spellId, SpellEffectIndex effindex); - Aura* GetAura(AuraType type, uint32 family, uint64 familyFlag, uint32 familyFlag2 = 0, uint64 casterGUID = 0); + Aura* GetAura(AuraType type, SpellFamily family, uint64 familyFlag, uint32 familyFlag2 = 0, ObjectGuid casterGuid = ObjectGuid()); SpellAuraHolder* GetSpellAuraHolder (uint32 spellid, uint64 casterGUID = 0); SpellAuraHolderMap & GetSpellAuraHolderMap() { return m_spellAuraHolders; } diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 7a7e3fc53..574a4ee04 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "10828" + #define REVISION_NR "10829" #endif // __REVISION_NR_H__