diff options
| author | megamage <none@none> | 2008-11-08 11:26:44 -0600 |
|---|---|---|
| committer | megamage <none@none> | 2008-11-08 11:26:44 -0600 |
| commit | bc0164355f6db1fc1b6dae997b01b19f0349f156 (patch) | |
| tree | 0ccd846277b3d3595ca6e1ac754885a8fb8d6dce /src/game/Spell.cpp | |
| parent | 4f59e96806a65ad759c51876370802b5497cd6c7 (diff) | |
[svn] Fix: DOT and HOT only proc effects when hit, but not on every tick (I know there is a proc flag patch, but this is a very quick fix).
Change the structure of customattrmap. Use bit flag instead of uint32 for every attribute.
--HG--
branch : trunk
Diffstat (limited to 'src/game/Spell.cpp')
| -rw-r--r-- | src/game/Spell.cpp | 39 |
1 files changed, 21 insertions, 18 deletions
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 770d0fd8bff..37b1139077f 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -1046,8 +1046,9 @@ void Spell::DoSpellHitOnUnit(Unit *unit, const uint32 effectMask) // Get multiplier float multiplier = m_spellInfo->DmgMultiplier[effectNumber]; // Apply multiplier mods - if(Player* modOwner = m_originalCaster->GetSpellModOwner()) - modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_EFFECT_PAST_FIRST, multiplier,this); + if(m_originalCaster) + if(Player* modOwner = m_originalCaster->GetSpellModOwner()) + modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_EFFECT_PAST_FIRST, multiplier,this); m_damageMultipliers[effectNumber] *= multiplier; } } @@ -1069,6 +1070,15 @@ void Spell::DoSpellHitOnUnit(Unit *unit, const uint32 effectMask) unit->CastSpell(unit, *i, true, 0, 0, m_caster->GetGUID()); } } + + if(spellmgr.GetSpellCustomAttr(m_spellInfo->Id) && m_originalCaster) + { + uint32 flag = spellmgr.GetSpellCustomAttr(m_spellInfo->Id); + if(flag & 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)) + m_originalCaster->ProcDamageAndSpell(unit, PROC_FLAG_HIT_SPELL, PROC_FLAG_STRUCK_SPELL, 0, GetSpellSchoolMask(m_spellInfo), m_spellInfo); + } } void Spell::DoAllEffectOnTarget(GOTargetInfo *target) @@ -1282,7 +1292,7 @@ void Spell::SearchAreaTarget(std::list<Unit*> &TagUnitMap, float radius, const u TypeContainerVisitor<Trinity::SpellNotifierCreatureAndPlayer, WorldTypeMapContainer > world_object_notifier(notifier); cell_lock->Visit(cell_lock, world_object_notifier, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster)); } - if(!spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_MAX_TARGETS)) + if(!(spellmgr.GetSpellCustomAttr(m_spellInfo->Id) & SPELL_ATTR_CU_PLAYERS_ONLY)) { TypeContainerVisitor<Trinity::SpellNotifierCreatureAndPlayer, GridTypeMapContainer > grid_object_notifier(notifier); cell_lock->Visit(cell_lock, grid_object_notifier, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster)); @@ -1342,8 +1352,7 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap) uint32 EffectChainTarget = m_spellInfo->EffectChainTarget[i]; uint32 unMaxTargets = m_spellInfo->MaxAffectedTargets; - if(!unMaxTargets) - unMaxTargets = spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_MAX_TARGETS); + if(m_originalCaster) { if(Player* modOwner = m_originalCaster->GetSpellModOwner()) @@ -1503,19 +1512,13 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap) }break; case TARGET_IN_FRONT_OF_CASTER: case TARGET_UNIT_CONE_ENEMY_UNKNOWN: - switch(spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_CONE_TYPE)) - { - default: - case 0: - SearchAreaTarget(TagUnitMap, radius, PUSH_IN_FRONT, SPELL_TARGETS_AOE_DAMAGE); - break; - case 1: - SearchAreaTarget(TagUnitMap, radius, PUSH_IN_BACK, SPELL_TARGETS_AOE_DAMAGE); - break; - case 2: - SearchAreaTarget(TagUnitMap, radius, PUSH_IN_LINE, SPELL_TARGETS_AOE_DAMAGE); - break; - }break; + if(spellmgr.GetSpellCustomAttr(m_spellInfo->Id) & 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) + SearchAreaTarget(TagUnitMap, radius, PUSH_IN_LINE, SPELL_TARGETS_AOE_DAMAGE); + else + SearchAreaTarget(TagUnitMap, radius, PUSH_IN_FRONT, SPELL_TARGETS_AOE_DAMAGE); + break; case TARGET_UNIT_CONE_ALLY: SearchAreaTarget(TagUnitMap, radius, PUSH_IN_FRONT, SPELL_TARGETS_FRIENDLY); break; |
