mirror of
https://github.com/mangosfour/server.git
synced 2025-12-13 04:37:00 +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, 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'),
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
if (!sunder || sunder->GetStackAmount() < sunder->GetSpellProto()->StackAmount)
|
||||
m_caster->CastSpell(unitTarget, 58567, true);
|
||||
}
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#ifndef __REVISION_NR_H__
|
||||
#define __REVISION_NR_H__
|
||||
#define REVISION_NR "10828"
|
||||
#define REVISION_NR "10829"
|
||||
#endif // __REVISION_NR_H__
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue