Changeset 196 for trunk

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

Location:
trunk/src/game
Files:
6 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); 
  • trunk/src/game/SpellAuras.cpp

    r178 r196  
    56245624            // DO NOT ACCESS MEMBERS OF THE AURA FROM NOW ON (DealDamage can delete aura) 
    56255625 
    5626             pCaster->ProcDamageAndSpell(target, PROC_FLAG_HIT_SPELL, PROC_FLAG_TAKE_DAMAGE, (pdamage <= absorb+resist) ? 0 : (pdamage-absorb-resist), GetSpellSchoolMask(spellProto), spellProto); 
     5626            pCaster->ProcDamageAndSpell(target, PROC_FLAG_NONE, PROC_FLAG_TAKE_DAMAGE, (pdamage <= absorb+resist) ? 0 : (pdamage-absorb-resist), GetSpellSchoolMask(spellProto), spellProto); 
    56275627            break; 
    56285628        } 
     
    57375737            // DO NOT ACCESS MEMBERS OF THE AURA FROM NOW ON (DealDamage can delete aura) 
    57385738 
    5739             pCaster->ProcDamageAndSpell(target, PROC_FLAG_HIT_SPELL, PROC_FLAG_TAKE_DAMAGE, new_damage, GetSpellSchoolMask(spellProto), spellProto); 
     5739            pCaster->ProcDamageAndSpell(target, PROC_FLAG_HEALED, PROC_FLAG_TAKE_DAMAGE, new_damage, GetSpellSchoolMask(spellProto), spellProto); 
    57405740            if (!target->isAlive() && pCaster->IsNonMeleeSpellCasted(false)) 
    57415741            { 
     
    58405840            // ignore item heals 
    58415841            if(procSpell && !haveCastItem) 
    5842                 pCaster->ProcDamageAndSpell(target,PROC_FLAG_HEAL, PROC_FLAG_HEALED, pdamage, SPELL_SCHOOL_MASK_NONE, spellProto); 
     5842                pCaster->ProcDamageAndSpell(target,PROC_FLAG_NONE, PROC_FLAG_HEALED, pdamage, SPELL_SCHOOL_MASK_NONE, spellProto); 
    58435843            break; 
    58445844        } 
  • trunk/src/game/SpellEffects.cpp

    r186 r196  
    312312 
    313313                // Meteor like spells (divided damage to targets) 
    314                 if(spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_SHARE_DAMAGE)) 
     314                if(spellmgr.GetSpellCustomAttr(m_spellInfo->Id) & SPELL_ATTR_CU_SHARE_DAMAGE) 
    315315                { 
    316316                    uint32 count = 0; 
  • trunk/src/game/SpellMgr.cpp

    r186 r196  
    19701970 
    19711971// set data in core for now 
    1972 void SpellMgr::LoadSpellExtraAttr() 
    1973 { 
    1974     SpellExtraAttribute tempAttr; 
    1975     tempAttr.attr[SPELL_EXTRA_ATTR_CONE_TYPE] = 0; 
    1976     tempAttr.attr[SPELL_EXTRA_ATTR_MAX_TARGETS] = 0; 
    1977     tempAttr.attr[SPELL_EXTRA_ATTR_SHARE_DAMAGE] = 0; 
    1978  
    1979     tempAttr.attr[SPELL_EXTRA_ATTR_CONE_TYPE] = 1; 
    1980     { 
    1981         SpellEntry const* tempSpell; 
    1982         for(uint32 i = 0; i < GetSpellStore()->GetNumRows(); ++i) 
    1983         { 
    1984             tempSpell = GetSpellStore()->LookupEntry(i); 
    1985             if(tempSpell && tempSpell->SpellVisual == 3879) 
    1986                 mSpellExtraAttrMap[tempSpell->Id] = tempAttr; 
    1987         } 
    1988     } 
    1989     tempAttr.attr[SPELL_EXTRA_ATTR_CONE_TYPE] = 2; 
    1990     mSpellExtraAttrMap[26029] = tempAttr; // dark glare 
    1991     mSpellExtraAttrMap[37433] = tempAttr; // spout 
    1992     mSpellExtraAttrMap[43140] = tempAttr; // flame breath 
    1993     mSpellExtraAttrMap[43215] = tempAttr; // flame breath 
    1994     tempAttr.attr[SPELL_EXTRA_ATTR_CONE_TYPE] = 0; 
    1995  
    1996     tempAttr.attr[SPELL_EXTRA_ATTR_SHARE_DAMAGE] = 1; 
    1997     for(uint32 i = 0; i < 46000; ++i) 
    1998     { 
    1999         switch(i) 
    2000         { 
    2001             case 24340: case 26558: case 28884:     // Meteor 
    2002             case 36837: case 38903: case 41276:     // Meteor 
    2003             case 26789:                             // Shard of the Fallen Star 
    2004             case 31436:                             // Malevolent Cleave 
    2005             case 35181:                             // Dive Bomb 
    2006             case 40810: case 43267: case 43268:     // Saber Lash 
    2007             case 42384:                             // Brutal Swipe 
    2008             case 45150:                             // Meteor Slash 
    2009                 mSpellExtraAttrMap[i] = tempAttr; 
    2010                 break; 
    2011             default: 
    2012                 break; 
    2013         } 
    2014     } 
    2015     tempAttr.attr[SPELL_EXTRA_ATTR_SHARE_DAMAGE] = 0; 
    2016  
    2017     tempAttr.attr[SPELL_EXTRA_ATTR_MAX_TARGETS] = 1; 
    2018     for(uint32 i = 0; i < 46000; ++i) 
    2019     { 
    2020         switch(i) 
    2021         { 
    2022             case 44978: case 45001: case 45002:     // Wild Magic 
    2023             case 45004: case 45006: case 45010:     // Wild Magic 
    2024             case 31347: // Doom 
    2025             case 41635: // Prayer of Mending 
    2026                 mSpellExtraAttrMap[i] = tempAttr; 
    2027                 break; 
    2028             default: 
    2029                 break; 
    2030         } 
    2031     } 
    2032     tempAttr.attr[SPELL_EXTRA_ATTR_MAX_TARGETS] = 3; 
    2033     mSpellExtraAttrMap[41376] = tempAttr;   //Spite 
    2034     mSpellExtraAttrMap[39992] = tempAttr;   //Needle Spine 
    2035     tempAttr.attr[SPELL_EXTRA_ATTR_MAX_TARGETS] = 0; 
    2036  
    2037     //hack here, only for those strange exceptions! 
    2038     // Psychic Scream 
     1972void SpellMgr::LoadSpellCustomAttr() 
     1973{ 
    20391974    SpellEntry *tempSpell; 
    2040     if(tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(8122)) 
    2041         tempSpell->Attributes |= SPELL_ATTR_BREAKABLE_BY_DAMAGE; 
    2042     if(tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(8124)) 
    2043         tempSpell->Attributes |= SPELL_ATTR_BREAKABLE_BY_DAMAGE; 
    2044     if(tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(10888)) 
    2045         tempSpell->Attributes |= SPELL_ATTR_BREAKABLE_BY_DAMAGE; 
    2046     if(tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(10890)) 
    2047         tempSpell->Attributes |= SPELL_ATTR_BREAKABLE_BY_DAMAGE; 
     1975    for(uint32 i = 0; i < GetSpellStore()->GetNumRows(); ++i) 
     1976    { 
     1977        tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(i); 
     1978        if(!tempSpell) 
     1979            continue; 
     1980 
     1981        mSpellCustomAttrMap[tempSpell->Id] = 0; 
     1982 
     1983        for(uint32 i = 0; i < 3; ++i) 
     1984        { 
     1985            switch(tempSpell->EffectApplyAuraName[i]) 
     1986            { 
     1987                case SPELL_AURA_PERIODIC_DAMAGE: 
     1988                case SPELL_AURA_PERIODIC_DAMAGE_PERCENT: 
     1989                case SPELL_AURA_PERIODIC_LEECH: 
     1990                    mSpellCustomAttrMap[tempSpell->Id] |= SPELL_ATTR_CU_EFFECT_DAMAGE; 
     1991                    break; 
     1992                case SPELL_AURA_PERIODIC_HEAL: 
     1993                case SPELL_AURA_OBS_MOD_HEALTH: 
     1994                    mSpellCustomAttrMap[tempSpell->Id] |= SPELL_ATTR_CU_EFFECT_HEAL; 
     1995                    break; 
     1996                default: 
     1997                    break; 
     1998            } 
     1999        } 
     2000 
     2001        if(tempSpell->SpellVisual == 3879) 
     2002            mSpellCustomAttrMap[tempSpell->Id] |= SPELL_ATTR_CU_CONE_BACK; 
     2003 
     2004        switch(tempSpell->Id) 
     2005        { 
     2006        case 26029: // dark glare 
     2007        case 37433: // spout 
     2008        case 43140: case 43215: // flame breath 
     2009            mSpellCustomAttrMap[tempSpell->Id] |= SPELL_ATTR_CU_CONE_LINE; 
     2010            break; 
     2011        case 24340: case 26558: case 28884:     // Meteor 
     2012        case 36837: case 38903: case 41276:     // Meteor 
     2013        case 26789:                             // Shard of the Fallen Star 
     2014        case 31436:                             // Malevolent Cleave 
     2015        case 35181:                             // Dive Bomb 
     2016        case 40810: case 43267: case 43268:     // Saber Lash 
     2017        case 42384:                             // Brutal Swipe 
     2018        case 45150:                             // Meteor Slash 
     2019            mSpellCustomAttrMap[tempSpell->Id] |= SPELL_ATTR_CU_SHARE_DAMAGE; 
     2020            break; 
     2021        case 44978: case 45001: case 45002:     // Wild Magic 
     2022        case 45004: case 45006: case 45010:     // Wild Magic 
     2023        case 31347: // Doom 
     2024        case 41635: // Prayer of Mending 
     2025            mSpellCustomAttrMap[tempSpell->Id] |= SPELL_ATTR_CU_PLAYERS_ONLY; 
     2026            tempSpell->MaxAffectedTargets = 1; 
     2027            break; 
     2028        case 41376: // Spite 
     2029        case 39992: // Needle Spine 
     2030            mSpellCustomAttrMap[tempSpell->Id] |= SPELL_ATTR_CU_PLAYERS_ONLY; 
     2031            tempSpell->MaxAffectedTargets = 3; 
     2032            break; 
     2033        case 8122: case 8124: case 10888: case 10890: // Psychic Scream 
     2034            tempSpell->Attributes |= SPELL_ATTR_BREAKABLE_BY_DAMAGE; 
     2035            break; 
     2036        default: 
     2037            break; 
     2038        } 
     2039    } 
    20482040} 
    20492041 
  • trunk/src/game/SpellMgr.h

    r157 r196  
    635635} 
    636636 
    637 enum SpellExtraAttributeType 
    638 { 
    639     SPELL_EXTRA_ATTR_MAX_TARGETS, 
    640     SPELL_EXTRA_ATTR_CONE_TYPE, 
    641     SPELL_EXTRA_ATTR_SHARE_DAMAGE 
    642 }; 
    643  
    644 struct SpellExtraAttribute 
    645 { 
    646     uint32 attr[3]; 
    647 }; 
    648  
    649 typedef std::map<uint32, SpellExtraAttribute> SpellExtraAttrMap; 
     637#define SPELL_ATTR_CU_PLAYERS_ONLY      0x00000001 
     638#define SPELL_ATTR_CU_CONE_BACK         0x00000002 
     639#define SPELL_ATTR_CU_CONE_LINE         0x00000004 
     640#define SPELL_ATTR_CU_SHARE_DAMAGE      0x00000008 
     641#define SPELL_ATTR_CU_EFFECT_HEAL       0x00000010 
     642#define SPELL_ATTR_CU_EFFECT_DAMAGE     0x00000020 
     643 
     644typedef std::map<uint32, uint32> SpellCustomAttrMap; 
    650645 
    651646typedef std::map<int32, std::vector<int32> > SpellLinkedMap; 
     
    849844        } 
    850845 
    851         uint32 GetSpellExtraAttr(uint32 spell_id, uint32 type) const 
    852         { 
    853             SpellExtraAttrMap::const_iterator itr = mSpellExtraAttrMap.find(spell_id); 
    854             if(itr != mSpellExtraAttrMap.end()) 
    855                 return itr->second.attr[type]; 
     846        uint32 GetSpellCustomAttr(uint32 spell_id) const 
     847        { 
     848            SpellCustomAttrMap::const_iterator itr = mSpellCustomAttrMap.find(spell_id); 
     849            if(itr != mSpellCustomAttrMap.end()) 
     850                return itr->second; 
    856851            else 
    857852                return 0; 
     
    880875        void LoadSkillLineAbilityMap(); 
    881876        void LoadSpellPetAuras(); 
    882         void LoadSpellExtraAttr(); 
     877        void LoadSpellCustomAttr(); 
    883878        void LoadSpellLinked(); 
    884879 
     
    895890        SkillLineAbilityMap mSkillLineAbilityMap; 
    896891        SpellPetAuraMap     mSpellPetAuraMap; 
    897         SpellExtraAttrMap   mSpellExtraAttrMap; 
     892        SpellCustomAttrMap  mSpellCustomAttrMap; 
    898893        SpellLinkedMap      mSpellLinkedMap; 
    899894}; 
  • trunk/src/game/World.cpp

    r181 r196  
    10961096 
    10971097    sLog.outString( "Loading spell extra attributes...(TODO)" ); 
    1098     spellmgr.LoadSpellExtraAttr(); 
     1098    spellmgr.LoadSpellCustomAttr(); 
    10991099 
    11001100    sLog.outString( "Loading linked spells..." );