Changeset 108 for trunk/src/game/Spell.h

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

[svn] Continue the work of rewriting spell target selection functions (warning: this may cause some spells broken).
Add some spell_script_target.
Delete some workaround in scripts (since core provides spell support now).

Original author: megamage
Date: 2008-10-25 10:37:28-05:00

Files:
1 modified

Legend:

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

    r102 r108  
    7676    PUSH_SELF_CENTER, 
    7777    PUSH_DEST_CENTER, 
    78     PUSH_TARGET_CENTER 
    7978}; 
    8079 
     
    8382namespace Trinity 
    8483{ 
    85     struct SpellNotifierPlayer; 
    8684    struct SpellNotifierCreatureAndPlayer; 
    8785} 
     
    181179}; 
    182180 
     181enum ReplenishType 
     182{ 
     183    REPLENISH_UNDEFINED = 0, 
     184    REPLENISH_HEALTH    = 20, 
     185    REPLENISH_MANA      = 21, 
     186    REPLENISH_RAGE      = 22 
     187}; 
     188 
     189enum SpellTargets 
     190{ 
     191    SPELL_TARGETS_FRIENDLY, 
     192    SPELL_TARGETS_AOE_DAMAGE, 
     193    SPELL_TARGETS_ENTRY 
     194}; 
     195 
    183196#define SPELL_SPELL_CHANNEL_UPDATE_INTERVAL 1000 
    184197 
     
    187200class Spell 
    188201{ 
    189     friend struct Trinity::SpellNotifierPlayer; 
    190202    friend struct Trinity::SpellNotifierCreatureAndPlayer; 
    191203    public: 
     
    498510        void DoAllEffectOnTarget(ItemTargetInfo *target); 
    499511        bool IsAliveUnitPresentInTargetList(); 
     512        void SearchAreaTarget(std::list<Unit*> &data, float radius, const uint32 &type, 
     513            SpellTargets TargetType, uint32 entry = 0); 
     514        Unit* SearchNearbyTarget(float radius, SpellTargets TargetType, uint32 entry = 0); 
     515        void SearchChainTarget(std::list<Unit*> &data, Unit* pUnitTarget, float max_range, uint32 unMaxTargets); 
    500516        // ------------------------------------------- 
    501517 
     
    519535}; 
    520536 
    521 enum ReplenishType 
    522 { 
    523     REPLENISH_UNDEFINED = 0, 
    524     REPLENISH_HEALTH    = 20, 
    525     REPLENISH_MANA      = 21, 
    526     REPLENISH_RAGE      = 22 
    527 }; 
    528  
    529 enum SpellTargets 
    530 { 
    531     SPELL_TARGETS_HOSTILE, 
    532     SPELL_TARGETS_NOT_FRIENDLY, 
    533     SPELL_TARGETS_NOT_HOSTILE, 
    534     SPELL_TARGETS_FRIENDLY, 
    535     SPELL_TARGETS_AOE_DAMAGE 
    536 }; 
    537  
    538537namespace Trinity 
    539538{ 
    540     struct TRINITY_DLL_DECL SpellNotifierPlayer 
    541     { 
    542         std::list<Unit*> &i_data; 
    543         Spell &i_spell; 
    544         const uint32& i_index; 
    545         float i_radius; 
    546         Unit* i_originalCaster; 
    547  
    548         SpellNotifierPlayer(Spell &spell, std::list<Unit*> &data, const uint32 &i, float radius) 
    549             : i_data(data), i_spell(spell), i_index(i), i_radius(radius) 
    550         { 
    551             i_originalCaster = i_spell.GetOriginalCaster(); 
    552         } 
    553  
    554         void Visit(PlayerMapType &m) 
    555         { 
    556             if(!i_originalCaster) 
    557                 return; 
    558  
    559             for(PlayerMapType::iterator itr=m.begin(); itr != m.end(); ++itr) 
    560             { 
    561                 Player * pPlayer = itr->getSource(); 
    562                 if( !pPlayer->isAlive() || pPlayer->isInFlight()) 
    563                     continue; 
    564  
    565                 if( i_originalCaster->IsFriendlyTo(pPlayer) ) 
    566                     continue; 
    567  
    568                 if( pPlayer->GetDistance(i_spell.m_targets.m_destX, i_spell.m_targets.m_destY, i_spell.m_targets.m_destZ) < i_radius ) 
    569                     i_data.push_back(pPlayer); 
    570             } 
    571         } 
    572         template<class SKIP> void Visit(GridRefManager<SKIP> &) {} 
    573     }; 
    574  
    575539    struct TRINITY_DLL_DECL SpellNotifierCreatureAndPlayer 
    576540    { 
     
    581545        SpellTargets i_TargetType; 
    582546        Unit* i_originalCaster; 
     547        uint32 i_entry; 
    583548 
    584549        SpellNotifierCreatureAndPlayer(Spell &spell, std::list<Unit*> &data, float radius, const uint32 &type, 
    585             SpellTargets TargetType = SPELL_TARGETS_NOT_FRIENDLY) 
    586             : i_data(&data), i_spell(spell), i_push_type(type), i_radius(radius), i_TargetType(TargetType) 
     550            SpellTargets TargetType = SPELL_TARGETS_AOE_DAMAGE, uint32 entry = 0) 
     551            : i_data(&data), i_spell(spell), i_push_type(type), i_radius(radius), i_TargetType(TargetType), i_entry(entry) 
    587552        { 
    588553            i_originalCaster = spell.GetOriginalCaster(); 
     
    603568                switch (i_TargetType) 
    604569                { 
    605                     case SPELL_TARGETS_HOSTILE: 
    606                         if (!itr->getSource()->isTargetableForAttack() || !i_originalCaster->IsHostileTo( itr->getSource() )) 
    607                             continue; 
    608                         break; 
    609                     case SPELL_TARGETS_NOT_FRIENDLY: 
    610                         if (!itr->getSource()->isTargetableForAttack() || i_originalCaster->IsFriendlyTo( itr->getSource() )) 
    611                             continue; 
    612                         break; 
    613                     case SPELL_TARGETS_NOT_HOSTILE: 
    614                         if (!itr->getSource()->isTargetableForAttack() || i_originalCaster->IsHostileTo( itr->getSource() )) 
    615                             continue; 
    616                         break; 
    617570                    case SPELL_TARGETS_FRIENDLY: 
    618571                        if (!itr->getSource()->isTargetableForAttack() || !i_originalCaster->IsFriendlyTo( itr->getSource() )) 
     
    638591                                continue; 
    639592                        } 
    640                     } 
    641                     break; 
     593                    }break; 
     594                    case SPELL_TARGETS_ENTRY: 
     595                    { 
     596                        if(itr->getSource()->GetTypeId()!=TYPEID_UNIT || itr->getSource()->GetEntry()!= i_entry) 
     597                            continue; 
     598                    }break; 
    642599                    default: continue; 
    643600                } 
     
    661618                            i_data->push_back(itr->getSource()); 
    662619                        break; 
    663                     case PUSH_TARGET_CENTER: 
    664                         if(i_spell.m_targets.getUnitTarget()->IsWithinDistInMap((Unit*)(itr->getSource()), i_radius)) 
    665                             i_data->push_back(itr->getSource()); 
    666                         break; 
    667620                } 
    668621            }