diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/game/Spell.cpp | 19 | ||||
-rw-r--r-- | src/game/Spell.h | 2 | ||||
-rw-r--r-- | src/game/SpellEffects.cpp | 2 | ||||
-rw-r--r-- | src/game/SpellMgr.cpp | 11 | ||||
-rw-r--r-- | src/game/SpellMgr.h | 1 |
5 files changed, 25 insertions, 10 deletions
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 1aec4e44d12..4d1e0db0b5d 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -277,6 +277,7 @@ Spell::Spell( Unit* Caster, SpellEntry const *info, bool triggered, uint64 origi ASSERT( info == sSpellStore.LookupEntry( info->Id ) && "`info` must be pointer to sSpellStore element"); m_spellInfo = info; + m_customAttr = spellmgr.GetSpellCustomAttr(m_spellInfo->Id); m_caster = Caster; m_selfContainer = NULL; m_triggeringContainer = triggeringContainer; @@ -1091,7 +1092,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target) { m_caster->CombatStart(unit); } - else if(spellmgr.GetSpellCustomAttr(m_spellInfo->Id) & SPELL_ATTR_CU_AURA_CC) + else if(m_customAttr & SPELL_ATTR_CU_AURA_CC) { if(!unit->IsStandState()) unit->SetStandState(PLAYER_STATE_NONE); @@ -1134,7 +1135,7 @@ void Spell::DoSpellHitOnUnit(Unit *unit, const uint32 effectMask) } unit->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_HITBYSPELL); - if(spellmgr.GetSpellCustomAttr(m_spellInfo->Id) & SPELL_ATTR_CU_AURA_CC) + if(m_customAttr & SPELL_ATTR_CU_AURA_CC) unit->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_CC); } else @@ -1205,12 +1206,11 @@ void Spell::DoSpellHitOnUnit(Unit *unit, const uint32 effectMask) } //This is not needed with procflag patch - /*if(spellmgr.GetSpellCustomAttr(m_spellInfo->Id) && m_originalCaster) + /*if(m_originalCaster) { - uint32 flag = spellmgr.GetSpellCustomAttr(m_spellInfo->Id); - if(flag & SPELL_ATTR_CU_EFFECT_HEAL) + if(m_customAttr & SPELL_ATTR_CU_EFFECT_HEAL) m_originalCaster->ProcDamageAndSpell(unit, PROC_FLAG_HEAL, PROC_FLAG_NONE, 0, GetSpellSchoolMask(m_spellInfo), m_spellInfo); - if(m_originalCaster != unit && (flag & SPELL_ATTR_CU_EFFECT_DAMAGE)) + if(m_originalCaster != unit && (m_customAttr & SPELL_ATTR_CU_EFFECT_DAMAGE)) m_originalCaster->ProcDamageAndSpell(unit, PROC_FLAG_HIT_SPELL, PROC_FLAG_STRUCK_SPELL, 0, GetSpellSchoolMask(m_spellInfo), m_spellInfo); }*/ } @@ -1662,9 +1662,9 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap) case TARGET_IN_FRONT_OF_CASTER: case TARGET_UNIT_CONE_ENEMY_UNKNOWN: - if(spellmgr.GetSpellCustomAttr(m_spellInfo->Id) & SPELL_ATTR_CU_CONE_BACK) + if(m_customAttr & SPELL_ATTR_CU_CONE_BACK) SearchAreaTarget(TagUnitMap, radius, PUSH_IN_BACK, SPELL_TARGETS_AOE_DAMAGE); - else if(spellmgr.GetSpellCustomAttr(m_spellInfo->Id) & SPELL_ATTR_CU_CONE_LINE) + else if(m_customAttr & SPELL_ATTR_CU_CONE_LINE) SearchAreaTarget(TagUnitMap, radius, PUSH_IN_LINE, SPELL_TARGETS_AOE_DAMAGE); else SearchAreaTarget(TagUnitMap, radius, PUSH_IN_FRONT, SPELL_TARGETS_AOE_DAMAGE); @@ -2218,7 +2218,8 @@ void Spell::cast(bool skipCheck) FillTargetMap(); - CalculateDamageDoneForAllTargets(); + if(m_customAttr & SPELL_ATTR_CU_DIRECT_DAMAGE) + CalculateDamageDoneForAllTargets(); // traded items have trade slot instead of guid in m_itemTargetGUID // set to real guid to be sent later to the client diff --git a/src/game/Spell.h b/src/game/Spell.h index b3e4dbc8c6a..474336edab8 100644 --- a/src/game/Spell.h +++ b/src/game/Spell.h @@ -567,6 +567,8 @@ class Spell // we can't store original aura link to prevent access to deleted auras // and in same time need aura data and after aura deleting. SpellEntry const* m_triggeredByAuraSpell; + + uint32 m_customAttr; }; namespace Trinity diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index 1198b807e8b..fc9f132e23d 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -319,7 +319,7 @@ void Spell::SpellDamageSchoolDmg(uint32 effect_idx) } // Meteor like spells (divided damage to targets) - if(spellmgr.GetSpellCustomAttr(m_spellInfo->Id) & SPELL_ATTR_CU_SHARE_DAMAGE) + if(m_customAttr & SPELL_ATTR_CU_SHARE_DAMAGE) { uint32 count = 0; for(std::list<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin();ihit != m_UniqueTargetInfo.end();++ihit) diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp index 494921eb2a5..87efc32952a 100644 --- a/src/game/SpellMgr.cpp +++ b/src/game/SpellMgr.cpp @@ -2121,6 +2121,17 @@ void SpellMgr::LoadSpellCustomAttr() default: break; } + + switch(spellInfo->Effect[j]) + { + case SPELL_EFFECT_SCHOOL_DAMAGE: + case SPELL_EFFECT_WEAPON_DAMAGE: + case SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL: + case SPELL_EFFECT_NORMALIZED_WEAPON_DMG: + case SPELL_EFFECT_WEAPON_PERCENT_DAMAGE: + case SPELL_EFFECT_HEAL: + mSpellCustomAttr[i] |= SPELL_ATTR_CU_DIRECT_DAMAGE; + } } if(spellInfo->SpellVisual == 3879) diff --git a/src/game/SpellMgr.h b/src/game/SpellMgr.h index ef5e8379341..2c659180035 100644 --- a/src/game/SpellMgr.h +++ b/src/game/SpellMgr.h @@ -690,6 +690,7 @@ inline bool IsProfessionSkill(uint32 skill) #define SPELL_ATTR_CU_AURA_DOT 0x00000020 #define SPELL_ATTR_CU_AURA_CC 0x00000040 #define SPELL_ATTR_CU_AURA_SPELL 0x00000080 +#define SPELL_ATTR_CU_DIRECT_DAMAGE 0x00000100 typedef std::vector<uint32> SpellCustomAttribute; |