[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, 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'),

View file

@ -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

View file

@ -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

View file

@ -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;

View file

@ -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)

View file

@ -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;
}

View file

@ -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; }

View file

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