[10829] Update SpellFamily check functions.

* Move SPELLFAMILY_* to DBCEnums.h and name it as SpellFamily
* Use enum in Unit::GetAura, move family mask code to new SpellEntry helper function.
* Avoid all auras scan in search of triggred spell for 20243.
This commit is contained in:
VladimirMangos 2010-12-06 08:36:01 +03:00
parent 695a64d42b
commit b6ea36192e
8 changed files with 52 additions and 54 deletions

View file

@ -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, 2, -1,-1,'Steady Shot', 'Spell::EffectSchoolDMG'),
( 0, 9,0x0000000100000000,0x00000000, -1, -1, -1, 3, -1,-1,'Steady Shot', 'Spell::EffectDummy'), ( 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,-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, -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, 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'), ( 0, 4,0x0000000000000080,0x00000000, -1, -1, -1, 2, -1,-1,'Thunder Clap', 'Spell::EffectSchoolDMG'),

View file

@ -432,6 +432,28 @@ enum SpellEffectIndex
#define MAX_EFFECT_INDEX 3 #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 enum VehicleFlags
{ {
VEHICLE_FLAG_ADJUST_AIM_ANGLE = 0x00000400, // Lua_IsVehicleAimAngleAdjustable VEHICLE_FLAG_ADJUST_AIM_ANGLE = 0x00000400, // Lua_IsVehicleAimAngleAdjustable

View file

@ -1517,6 +1517,16 @@ struct SpellEntry
return EffectSpellClassMaskA + effect * 3; 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: private:
// prevent creating custom entries (copy data from original in fact) // prevent creating custom entries (copy data from original in fact)
SpellEntry(SpellEntry const&); // DON'T must have implementation SpellEntry(SpellEntry const&); // DON'T must have implementation

View file

@ -5263,30 +5263,22 @@ void Spell::EffectWeaponDmg(SpellEffectIndex eff_idx)
} }
case SPELLFAMILY_WARRIOR: case SPELLFAMILY_WARRIOR:
{ {
// Devastate bonus and sunder armor refresh // Devastate
if(m_spellInfo->SpellVisual[0] == 12295 && m_spellInfo->SpellIconID == 1508) if(m_spellInfo->SpellVisual[0] == 12295 && m_spellInfo->SpellIconID == 1508)
{ {
uint32 stack = 0; // Sunder Armor
// Need refresh all Sunder Armor auras from this caster Aura* sunder = unitTarget->GetAura(SPELL_AURA_MOD_RESISTANCE_PCT, SPELLFAMILY_WARRIOR, UI64LIT(0x0000000000004000), 0x00000000, m_caster->GetObjectGuid());
Unit::SpellAuraHolderMap& suAuras = unitTarget->GetSpellAuraHolderMap();
SpellEntry const *spellInfo; // Devastate bonus and sunder armor refresh
for(Unit::SpellAuraHolderMap::iterator itr = suAuras.begin(); itr != suAuras.end(); ++itr) if (sunder)
{ {
spellInfo = (*itr).second->GetSpellProto(); sunder->GetHolder()->RefreshHolder();
if( spellInfo->SpellFamilyName == SPELLFAMILY_WARRIOR && spell_bonus += sunder->GetStackAmount() * CalculateDamage(EFFECT_INDEX_2, unitTarget);
(spellInfo->SpellFamilyFlags & UI64LIT(0x0000000000004000)) &&
(*itr).second->GetCasterGUID() == m_caster->GetGUID())
{
(*itr).second->RefreshHolder();
stack = (*itr).second->GetStackAmount();
break;
}
} }
if (stack)
spell_bonus += stack * CalculateDamage(EFFECT_INDEX_2, unitTarget); // Devastate causing Sunder Armor Effect
if (!stack || stack < spellInfo->StackAmount) // and no need to cast over max stack amount
// Devastate causing Sunder Armor Effect if (!sunder || sunder->GetStackAmount() < sunder->GetSpellProto()->StackAmount)
// and no need to cast over max stack amount
m_caster->CastSpell(unitTarget, 58567, true); m_caster->CastSpell(unitTarget, 58567, true);
} }
break; break;

View file

@ -46,28 +46,6 @@ enum SpellCategories
SPELLCATEGORY_JUDGEMENT = 1210, // Judgement (seal trigger) 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 //Some SpellFamilyFlags
#define SPELLFAMILYFLAG_ROGUE_VANISH UI64LIT(0x0000000000000800) #define SPELLFAMILYFLAG_ROGUE_VANISH UI64LIT(0x0000000000000800)
#define SPELLFAMILYFLAG_ROGUE_STEALTH UI64LIT(0x0000000000400000) #define SPELLFAMILYFLAG_ROGUE_STEALTH UI64LIT(0x0000000000400000)

View file

@ -4896,19 +4896,14 @@ Aura* Unit::GetAura(uint32 spellId, SpellEffectIndex effindex)
return NULL; 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); AuraList const& auras = GetAurasByType(type);
for(AuraList::const_iterator i = auras.begin();i != auras.end(); ++i) for(AuraList::const_iterator i = auras.begin();i != auras.end(); ++i)
{ if ((*i)->GetSpellProto()->IsFitToFamily(family, familyFlag, familyFlag2) &&
SpellEntry const *spell = (*i)->GetSpellProto(); (casterGuid.IsEmpty() || (*i)->GetCasterGuid() == casterGuid))
if (spell->SpellFamilyName == family && (spell->SpellFamilyFlags & familyFlag || spell->SpellFamilyFlags2 & familyFlag2)) return *i;
{
if (casterGUID && (*i)->GetCasterGUID()!=casterGUID)
continue;
return (*i);
}
}
return NULL; return NULL;
} }

View file

@ -1760,7 +1760,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
uint8 GetVisibleAurasCount() { return m_visibleAuras.size(); } uint8 GetVisibleAurasCount() { return m_visibleAuras.size(); }
Aura* GetAura(uint32 spellId, SpellEffectIndex effindex); 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); SpellAuraHolder* GetSpellAuraHolder (uint32 spellid, uint64 casterGUID = 0);
SpellAuraHolderMap & GetSpellAuraHolderMap() { return m_spellAuraHolders; } SpellAuraHolderMap & GetSpellAuraHolderMap() { return m_spellAuraHolders; }

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "10828" #define REVISION_NR "10829"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__