mirror of
https://github.com/mangosfour/server.git
synced 2025-12-13 13:37:05 +00:00
[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:
parent
695a64d42b
commit
b6ea36192e
8 changed files with 52 additions and 54 deletions
|
|
@ -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'),
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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; }
|
||||||
|
|
|
||||||
|
|
@ -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__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue