Show
Ignore:
Timestamp:
11/19/08 13:45:21 (17 years ago)
Author:
yumileroy
Message:

[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.

Original author: megamage
Date: 2008-11-08 11:26:44-06:00

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/game/Spell.cpp

    r194 r196  
    10471047                float multiplier = m_spellInfo->DmgMultiplier[effectNumber]; 
    10481048                // Apply multiplier mods 
    1049                 if(Player* modOwner = m_originalCaster->GetSpellModOwner()) 
    1050                     modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_EFFECT_PAST_FIRST, multiplier,this); 
     1049                if(m_originalCaster) 
     1050                    if(Player* modOwner = m_originalCaster->GetSpellModOwner()) 
     1051                        modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_EFFECT_PAST_FIRST, multiplier,this); 
    10511052                m_damageMultipliers[effectNumber] *= multiplier; 
    10521053            } 
     
    10691070                unit->CastSpell(unit, *i, true, 0, 0, m_caster->GetGUID()); 
    10701071        } 
     1072    } 
     1073 
     1074    if(spellmgr.GetSpellCustomAttr(m_spellInfo->Id) && m_originalCaster) 
     1075    { 
     1076        uint32 flag = spellmgr.GetSpellCustomAttr(m_spellInfo->Id); 
     1077        if(flag & SPELL_ATTR_CU_EFFECT_HEAL) 
     1078            m_originalCaster->ProcDamageAndSpell(unit, PROC_FLAG_HEAL, PROC_FLAG_NONE, 0, GetSpellSchoolMask(m_spellInfo), m_spellInfo); 
     1079        if(m_originalCaster != unit && (flag & SPELL_ATTR_CU_EFFECT_DAMAGE))  
     1080            m_originalCaster->ProcDamageAndSpell(unit, PROC_FLAG_HIT_SPELL, PROC_FLAG_STRUCK_SPELL, 0, GetSpellSchoolMask(m_spellInfo), m_spellInfo); 
    10711081    } 
    10721082} 
     
    12831293        cell_lock->Visit(cell_lock, world_object_notifier, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster)); 
    12841294    } 
    1285     if(!spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_MAX_TARGETS)) 
     1295    if(!(spellmgr.GetSpellCustomAttr(m_spellInfo->Id) & SPELL_ATTR_CU_PLAYERS_ONLY)) 
    12861296    { 
    12871297        TypeContainerVisitor<Trinity::SpellNotifierCreatureAndPlayer, GridTypeMapContainer >  grid_object_notifier(notifier); 
     
    13431353    uint32 EffectChainTarget = m_spellInfo->EffectChainTarget[i]; 
    13441354    uint32 unMaxTargets = m_spellInfo->MaxAffectedTargets; 
    1345     if(!unMaxTargets) 
    1346         unMaxTargets = spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_MAX_TARGETS); 
     1355 
    13471356    if(m_originalCaster) 
    13481357    { 
     
    15041513        case TARGET_IN_FRONT_OF_CASTER: 
    15051514        case TARGET_UNIT_CONE_ENEMY_UNKNOWN: 
    1506             switch(spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_CONE_TYPE)) 
    1507             { 
    1508                 default: 
    1509                 case 0: 
    1510                     SearchAreaTarget(TagUnitMap, radius, PUSH_IN_FRONT, SPELL_TARGETS_AOE_DAMAGE); 
    1511                     break; 
    1512                 case 1: 
    1513                     SearchAreaTarget(TagUnitMap, radius, PUSH_IN_BACK, SPELL_TARGETS_AOE_DAMAGE); 
    1514                     break; 
    1515                 case 2: 
    1516                     SearchAreaTarget(TagUnitMap, radius, PUSH_IN_LINE, SPELL_TARGETS_AOE_DAMAGE); 
    1517                     break; 
    1518             }break; 
     1515            if(spellmgr.GetSpellCustomAttr(m_spellInfo->Id) & SPELL_ATTR_CU_CONE_BACK) 
     1516                SearchAreaTarget(TagUnitMap, radius, PUSH_IN_BACK, SPELL_TARGETS_AOE_DAMAGE); 
     1517            else if(spellmgr.GetSpellCustomAttr(m_spellInfo->Id) & SPELL_ATTR_CU_CONE_LINE) 
     1518                SearchAreaTarget(TagUnitMap, radius, PUSH_IN_LINE, SPELL_TARGETS_AOE_DAMAGE); 
     1519            else 
     1520                SearchAreaTarget(TagUnitMap, radius, PUSH_IN_FRONT, SPELL_TARGETS_AOE_DAMAGE); 
     1521            break; 
    15191522        case TARGET_UNIT_CONE_ALLY: 
    15201523            SearchAreaTarget(TagUnitMap, radius, PUSH_IN_FRONT, SPELL_TARGETS_FRIENDLY);