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

[svn] Rewrite canSeeOrDetect function.
Minor change on trigger creatures.
Remove some unused hacks in scripts.

Original author: megamage
Date: 2008-11-06 10:27:58-06:00

Location:
trunk/src/bindings/scripts/scripts/zone/black_temple
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp

    r158 r178  
    11/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/> 
    2  * This program is free software; you can redistribute it and/or modify 
    3  * it under the terms of the GNU General Public License as published by 
    4  * the Free Software Foundation; either version 2 of the License, or 
    5  * (at your option) any later version. 
    6  * 
    7  * This program is distributed in the hope that it will be useful, 
    8  * but WITHOUT ANY WARRANTY; without even the implied warranty of 
    9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
    10  * GNU General Public License for more details. 
    11  * 
    12  * You should have received a copy of the GNU General Public License 
    13  * along with this program; if not, write to the Free Software 
    14  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
    15  */ 
     2* This program is free software; you can redistribute it and/or modify 
     3* it under the terms of the GNU General Public License as published by 
     4* the Free Software Foundation; either version 2 of the License, or 
     5* (at your option) any later version. 
     6* 
     7* This program is distributed in the hope that it will be useful, 
     8* but WITHOUT ANY WARRANTY; without even the implied warranty of 
     9* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
     10* GNU General Public License for more details. 
     11* 
     12* You should have received a copy of the GNU General Public License 
     13* along with this program; if not, write to the Free Software 
     14* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
     15*/ 
    1616 
    1717/* ScriptData 
     
    383383    uint64 GlaiveGUID[2]; 
    384384 
    385     std::list<uint64> ParasiteTargets; // for safety, do not use Unit* 
    386  
    387385    void Reset(); 
    388386 
     
    434432    void Aggro(Unit *who) 
    435433    { 
     434        m_creature->setActive(true); 
    436435        DoZoneInCombat(); 
    437436    } 
     
    502501            m_creature->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE ); 
    503502        } 
    504     } 
    505  
    506     void AddParasiteTarget(uint64 targetGUID) 
    507     { 
    508         for(std::list<uint64>::iterator tIter = ParasiteTargets.begin(); tIter != ParasiteTargets.end(); tIter++) 
    509         { 
    510             if(*tIter == targetGUID) 
    511                 return; 
    512         } 
    513         ParasiteTargets.push_back(targetGUID); 
    514  
    515         if(Phase == PHASE_NORMAL || Phase == PHASE_NORMAL_2 || Phase == PHASE_NORMAL_MAIEV) 
    516             Timer[EVENT_PARASITE_CHECK] += 1000; 
    517503    } 
    518504 
     
    563549        case 1://lift off 
    564550            m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); 
    565             //m_creature->GetMotionMaster()->Clear(false); 
    566551            m_creature->SetUnitMovementFlags(MOVEMENTFLAG_LEVITATING + MOVEMENTFLAG_ONTRANSPORT); 
    567             //m_creature->GetMotionMaster()->MovePoint(0, m_creature->GetPositionX(),m_creature->GetPositionY(),m_creature->GetPositionZ()); 
    568552            m_creature->StopMoving(); 
    569553            DoYell(SAY_TAKEOFF, LANG_UNIVERSAL, NULL); 
     
    572556            break; 
    573557        case 2://move to center 
    574             //m_creature->GetMotionMaster()->Clear(false); 
    575             //m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); 
    576558            m_creature->GetMotionMaster()->MovePoint(0, CENTER_X + 5, CENTER_Y, CENTER_Z); //+5, for SPELL_THROW_GLAIVE bug 
    577             //m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); 
    578559            Timer[EVENT_FLIGHT_SEQUENCE] = 0; 
    579560            break; 
     
    615596            break; 
    616597        case 6://fly to hover point 
    617             //m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); 
    618598            m_creature->GetMotionMaster()->MovePoint(0, HoverPosition[HoverPoint].x, HoverPosition[HoverPoint].y, HoverPosition[HoverPoint].z); 
    619             //m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); 
    620599            Timer[EVENT_FLIGHT_SEQUENCE] = 0; 
    621600            break; 
    622601        case 7://return to center 
    623             //m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); 
    624602            m_creature->GetMotionMaster()->MovePoint(0, CENTER_X, CENTER_Y, CENTER_Z); 
    625             //m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); 
    626603            Timer[EVENT_FLIGHT_SEQUENCE] = 0; 
    627604            break; 
     
    642619            break; 
    643620        case 9://land 
    644             //m_creature->GetMotionMaster()->Clear(false); 
    645621            m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING + MOVEMENTFLAG_ONTRANSPORT); 
    646             //m_creature->GetMotionMaster()->MovePoint(0, m_creature->GetPositionX(),m_creature->GetPositionY(),m_creature->GetPositionZ()); 
    647622            m_creature->StopMoving(); 
    648623            m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LAND); 
     
    664639            DoResetThreat(); 
    665640            m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE + UNIT_FLAG_NOT_SELECTABLE); 
    666             //m_creature->GetMotionMaster()->Clear(); 
    667641            m_creature->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE ); 
    668642            EnterPhase(PHASE_NORMAL_2); 
     
    724698    void UpdateAI(const uint32 diff) 
    725699    { 
    726         if((!m_creature->SelectHostilTarget() || !m_creature->getVictim()) && Phase < PHASE_TALK_SEQUENCE) 
     700        if((!m_creature->SelectHostilTarget() && !m_creature->getVictim()) && Phase < PHASE_TALK_SEQUENCE) 
    727701            return; 
    728702 
    729703        Event = EVENT_NULL; 
    730704        for(uint32 i = 1; i <= MaxTimer[Phase]; i++) 
     705        { 
    731706            if(Timer[i]) 
    732707                if(Timer[i] <= diff) 
     
    736711                } 
    737712                else Timer[i] -= diff; 
    738  
    739                 switch(Phase) 
     713        } 
     714 
     715        switch(Phase) 
     716        { 
     717        case PHASE_NORMAL: 
     718            if(HPPCT(m_creature) < 65) 
     719                EnterPhase(PHASE_FLIGHT_SEQUENCE); 
     720            break; 
     721 
     722        case PHASE_NORMAL_2: 
     723            if(m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 30) 
     724                EnterPhase(PHASE_TALK_SEQUENCE); 
     725            break; 
     726 
     727        case PHASE_NORMAL_MAIEV: 
     728            if(m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 1) 
     729                EnterPhase(PHASE_TALK_SEQUENCE); 
     730            break; 
     731 
     732        case PHASE_TALK_SEQUENCE: 
     733            if(Event == EVENT_TALK_SEQUENCE) 
     734                HandleTalkSequence(); 
     735            break; 
     736 
     737        case PHASE_FLIGHT_SEQUENCE: 
     738            if(Event == EVENT_FLIGHT_SEQUENCE) 
     739                HandleFlightSequence(); 
     740            break; 
     741 
     742        case PHASE_TRANSFORM_SEQUENCE: 
     743            if(Event == EVENT_TRANSFORM_SEQUENCE) 
     744                HandleTransformSequence(); 
     745            break; 
     746        } 
     747 
     748        if(m_creature->IsNonMeleeSpellCasted(false)) 
     749            return; 
     750 
     751        if(Phase == PHASE_NORMAL || Phase == PHASE_NORMAL_2 || Phase == PHASE_NORMAL_MAIEV && !m_creature->HasAura(SPELL_CAGED, 0)) 
     752        { 
     753            switch(Event) 
     754            { 
     755                //PHASE_NORMAL 
     756            case EVENT_BERSERK: 
     757                DoYell(SAY_ENRAGE, LANG_UNIVERSAL, NULL); 
     758                DoPlaySoundToSet(m_creature, SOUND_ENRAGE); 
     759                DoCast(m_creature, SPELL_BERSERK, true); 
     760                Timer[EVENT_BERSERK] = 5000;//The buff actually lasts forever. 
     761                break; 
     762 
     763            case EVENT_TAUNT: 
    740764                { 
    741                 case PHASE_NORMAL: 
    742                     if(HPPCT(m_creature) < 65) 
    743                         EnterPhase(PHASE_FLIGHT_SEQUENCE); 
    744                     break; 
    745  
    746                 case PHASE_NORMAL_2: 
    747                     if(m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 30) 
    748                         EnterPhase(PHASE_TALK_SEQUENCE); 
    749                     break; 
    750  
    751                 case PHASE_NORMAL_MAIEV: 
    752                     if(m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 1) 
    753                         EnterPhase(PHASE_TALK_SEQUENCE); 
    754                     break; 
    755  
    756                 case PHASE_TALK_SEQUENCE: 
    757                     if(Event == EVENT_TALK_SEQUENCE) 
    758                         HandleTalkSequence(); 
    759                     break; 
    760  
    761                 case PHASE_FLIGHT_SEQUENCE: 
    762                     if(Event == EVENT_FLIGHT_SEQUENCE) 
    763                         HandleFlightSequence(); 
    764                     break; 
    765  
    766                 case PHASE_TRANSFORM_SEQUENCE: 
    767                     if(Event == EVENT_TRANSFORM_SEQUENCE) 
    768                         HandleTransformSequence(); 
    769                     break; 
     765                    uint32 random = rand()%4; 
     766                    char* yell = RandomTaunts[random].text; 
     767                    uint32 soundid = RandomTaunts[random].sound; 
     768                    if(yell) 
     769                        DoYell(yell, LANG_UNIVERSAL, NULL); 
     770                    if(soundid) 
     771                        DoPlaySoundToSet(m_creature, soundid); 
    770772                } 
    771  
    772                 if(m_creature->IsNonMeleeSpellCasted(false)) 
    773                     return; 
    774  
    775                 if(Phase == PHASE_NORMAL || Phase == PHASE_NORMAL_2 || Phase == PHASE_NORMAL_MAIEV && !m_creature->HasAura(SPELL_CAGED, 0)) 
     773                Timer[EVENT_TAUNT] = 32000; 
     774                break; 
     775 
     776            case EVENT_SHEAR: 
     777                DoCast(m_creature->getVictim(), SPELL_SHEAR); 
     778                Timer[EVENT_SHEAR] = 25000 + (rand()%16 * 1000); 
     779                break; 
     780 
     781            case EVENT_FLAME_CRASH: 
     782                DoCast(m_creature->getVictim(), SPELL_FLAME_CRASH); 
     783                Timer[EVENT_FLAME_CRASH] = 35000; 
     784                break; 
     785 
     786            case EVENT_PARASITIC_SHADOWFIEND: 
    776787                { 
    777                     switch(Event) 
    778                     { 
    779                         //PHASE_NORMAL 
    780                     case EVENT_BERSERK: 
    781                         DoYell(SAY_ENRAGE, LANG_UNIVERSAL, NULL); 
    782                         DoPlaySoundToSet(m_creature, SOUND_ENRAGE); 
    783                         DoCast(m_creature, SPELL_BERSERK, true); 
    784                         Timer[EVENT_BERSERK] = 5000;//The buff actually lasts forever. 
    785                         break; 
    786  
    787                     case EVENT_TAUNT: 
    788                         { 
    789                             uint32 random = rand()%4; 
    790                             char* yell = RandomTaunts[random].text; 
    791                             uint32 soundid = RandomTaunts[random].sound; 
    792                             if(yell) 
    793                                 DoYell(yell, LANG_UNIVERSAL, NULL); 
    794                             if(soundid) 
    795                                 DoPlaySoundToSet(m_creature, soundid); 
    796                         } 
    797                         Timer[EVENT_TAUNT] = 32000; 
    798                         break; 
    799  
    800                     case EVENT_SHEAR: 
    801                         DoCast(m_creature->getVictim(), SPELL_SHEAR); 
    802                         Timer[EVENT_SHEAR] = 25000 + (rand()%16 * 1000); 
    803                         break; 
    804  
    805                     case EVENT_FLAME_CRASH: 
    806                         DoCast(m_creature->getVictim(), SPELL_FLAME_CRASH); 
    807                         Timer[EVENT_FLAME_CRASH] = 35000; 
    808                         break; 
    809  
    810                     case EVENT_PARASITIC_SHADOWFIEND: 
    811                         { 
    812                             Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 1); 
    813                             if(!target) target = m_creature->getVictim(); 
    814                             if(target->GetTypeId() == TYPEID_PLAYER && !target->HasAura(SPELL_PARASITIC_SHADOWFIEND, 0)) 
    815                             { 
    816                                 target->CastSpell(target, SPELL_PARASITIC_SHADOWFIEND, true); // do not miss 
    817                                 ParasiteTargets.push_back(target->GetGUID()); 
    818                                 Timer[EVENT_PARASITE_CHECK] += 1000; // do not check immediately 
    819                             } 
    820                             Timer[EVENT_PARASITIC_SHADOWFIEND] = 40000; 
    821                         } 
    822                         break; 
    823  
    824                     case EVENT_PARASITE_CHECK: 
    825                         for(std::list<uint64>::iterator tIter = ParasiteTargets.begin(); tIter != ParasiteTargets.end();) 
    826                         { 
    827                             Unit* target = Unit::GetUnit((*m_creature), *tIter); 
    828                             if(!target || !target->HasAura(SPELL_PARASITIC_SHADOWFIEND, 0)) 
    829                             { 
    830                                 if(target && target->isAlive()) 
    831                                     target->CastSpell(target, SPELL_SUMMON_PARASITICS, true); 
    832                                 std::list<uint64>::iterator tIter2 = tIter; 
    833                                 ++tIter; 
    834                                 ParasiteTargets.erase(tIter2); 
    835                             } 
    836                             else 
    837                                 ++tIter; 
    838                         } 
    839                         if(ParasiteTargets.empty()) 
    840                             Timer[EVENT_PARASITE_CHECK] = 0; 
    841                         else 
    842                             Timer[EVENT_PARASITE_CHECK] = 1000; 
    843                         break; 
    844  
    845                     case EVENT_DRAW_SOUL: 
    846                         DoCast(m_creature->getVictim(), SPELL_DRAW_SOUL); 
    847                         Timer[EVENT_DRAW_SOUL] = 55000;           
    848                         break; 
    849  
    850                         //PHASE_NORMAL_2 
    851                     case EVENT_AGONIZING_FLAMES: 
    852                         DoCast(SelectUnit(SELECT_TARGET_RANDOM,0), SPELL_AGONIZING_FLAMES); 
    853                         Timer[EVENT_AGONIZING_FLAMES] = 0; 
    854                         break; 
    855  
    856                     case EVENT_TRANSFORM_NORMAL: 
    857                         EnterPhase(PHASE_TRANSFORM_SEQUENCE); 
    858                         break; 
    859  
    860                         //PHASE_NORMAL_MAIEV 
    861                     case EVENT_ENRAGE: 
    862                         DoCast(m_creature, SPELL_ENRAGE); 
    863                         Timer[EVENT_ENRAGE] = 0; 
    864                         break; 
    865  
    866                     default: 
    867                         break; 
    868                     } 
    869                     DoMeleeAttackIfReady(); 
     788                    Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 1, 200, true); 
     789                    if(!target) target = m_creature->getVictim(); 
     790                    if(target) 
     791                        m_creature->CastSpell(target, SPELL_PARASITIC_SHADOWFIEND, true); 
     792                }break; 
     793 
     794            case EVENT_PARASITE_CHECK: 
     795                Timer[EVENT_PARASITE_CHECK] = 0; 
     796                break; 
     797 
     798            case EVENT_DRAW_SOUL: 
     799                DoCast(m_creature->getVictim(), SPELL_DRAW_SOUL); 
     800                Timer[EVENT_DRAW_SOUL] = 55000;           
     801                break; 
     802 
     803                //PHASE_NORMAL_2 
     804            case EVENT_AGONIZING_FLAMES: 
     805                DoCast(SelectUnit(SELECT_TARGET_RANDOM,0), SPELL_AGONIZING_FLAMES); 
     806                Timer[EVENT_AGONIZING_FLAMES] = 0; 
     807                break; 
     808 
     809            case EVENT_TRANSFORM_NORMAL: 
     810                EnterPhase(PHASE_TRANSFORM_SEQUENCE); 
     811                break; 
     812 
     813                //PHASE_NORMAL_MAIEV 
     814            case EVENT_ENRAGE: 
     815                DoCast(m_creature, SPELL_ENRAGE); 
     816                Timer[EVENT_ENRAGE] = 0; 
     817                break; 
     818 
     819            default: 
     820                break; 
     821            } 
     822            DoMeleeAttackIfReady(); 
     823        } 
     824 
     825        if(Phase == PHASE_FLIGHT) 
     826        { 
     827            switch(Event) 
     828            { 
     829            case EVENT_FIREBALL: 
     830                DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_FIREBALL); 
     831                Timer[EVENT_FIREBALL] = 3000; 
     832                break; 
     833 
     834            case EVENT_DARK_BARRAGE: 
     835                DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_DARK_BARRAGE); 
     836                Timer[EVENT_DARK_BARRAGE] = 0; 
     837                break; 
     838 
     839            case EVENT_EYE_BLAST: 
     840                CastEyeBlast();  
     841                Timer[EVENT_EYE_BLAST] = 0; 
     842                break; 
     843 
     844            case EVENT_MOVE_POINT: 
     845                Phase = PHASE_FLIGHT_SEQUENCE; 
     846                Timer[EVENT_FLIGHT_SEQUENCE] = 0;//do not start Event when changing hover point 
     847                for (uint8 i = 0; i <= rand()%3; i++) 
     848                { 
     849                    HoverPoint++; 
     850                    if(HoverPoint > 3) 
     851                        HoverPoint = 0; 
    870852                } 
    871  
    872                 if(Phase == PHASE_FLIGHT) 
    873                 { 
    874                     switch(Event) 
    875                     { 
    876                     case EVENT_FIREBALL: 
    877                         DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_FIREBALL); 
    878                         Timer[EVENT_FIREBALL] = 3000; 
    879                         break; 
    880  
    881                     case EVENT_DARK_BARRAGE: 
    882                         DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_DARK_BARRAGE); 
    883                         Timer[EVENT_DARK_BARRAGE] = 0; 
    884                         break; 
    885  
    886                     case EVENT_EYE_BLAST: 
    887                         CastEyeBlast();  
    888                         Timer[EVENT_EYE_BLAST] = 0; 
    889                         break; 
    890  
    891                     case EVENT_MOVE_POINT: 
    892                         Phase = PHASE_FLIGHT_SEQUENCE; 
    893                         Timer[EVENT_FLIGHT_SEQUENCE] = 0;//do not start Event when changing hover point 
    894                         for (uint8 i = 0; i <= rand()%3; i++) 
    895                         { 
    896                             HoverPoint++; 
    897                             if(HoverPoint > 3) 
    898                                 HoverPoint = 0; 
    899                         } 
    900                         m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); 
    901                         m_creature->GetMotionMaster()->MovePoint(0, HoverPosition[HoverPoint].x, HoverPosition[HoverPoint].y, HoverPosition[HoverPoint].z); 
    902                         m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); 
    903                         break; 
    904  
    905                     default: 
    906                         break; 
    907                     } 
    908                 } 
    909  
    910                 if(Phase == PHASE_DEMON) 
    911                 { 
    912                     switch(Event) 
    913                     { 
    914                     case EVENT_SHADOW_BLAST: 
    915                         m_creature->GetMotionMaster()->Clear(false); 
    916                         if(!m_creature->IsWithinDistInMap(m_creature->getVictim(), 50)||!m_creature->IsWithinLOSInMap(m_creature->getVictim())) 
    917                             m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim(), 30); 
    918                         else 
    919                             m_creature->GetMotionMaster()->MoveIdle(); 
    920                         DoCast(m_creature->getVictim(), SPELL_SHADOW_BLAST); 
    921                         Timer[EVENT_SHADOW_BLAST] = 4000; 
    922                         break; 
    923                     case EVENT_SHADOWDEMON: 
    924                         DoCast(m_creature, SPELL_SUMMON_SHADOWDEMON); 
    925                         Timer[EVENT_SHADOWDEMON] = 0; 
    926                         Timer[EVENT_FLAME_BURST] += 10000; 
    927                         break; 
    928                     case EVENT_FLAME_BURST: 
    929                         DoCast(m_creature, SPELL_FLAME_BURST); 
    930                         Timer[EVENT_FLAME_BURST] = 15000; 
    931                         break; 
    932                     case EVENT_TRANSFORM_DEMON: 
    933                         EnterPhase(PHASE_TRANSFORM_SEQUENCE); 
    934                         break; 
    935                     default: 
    936                         break; 
    937                     } 
    938                 } 
     853                m_creature->GetMotionMaster()->MovePoint(0, HoverPosition[HoverPoint].x, HoverPosition[HoverPoint].y, HoverPosition[HoverPoint].z); 
     854                break; 
     855 
     856            default: 
     857                break; 
     858            } 
     859        } 
     860 
     861        if(Phase == PHASE_DEMON) 
     862        { 
     863            switch(Event) 
     864            { 
     865            case EVENT_SHADOW_BLAST: 
     866                m_creature->GetMotionMaster()->Clear(false); 
     867                if(!m_creature->IsWithinDistInMap(m_creature->getVictim(), 50)||!m_creature->IsWithinLOSInMap(m_creature->getVictim())) 
     868                    m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim(), 30); 
     869                else 
     870                    m_creature->GetMotionMaster()->MoveIdle(); 
     871                DoCast(m_creature->getVictim(), SPELL_SHADOW_BLAST); 
     872                Timer[EVENT_SHADOW_BLAST] = 4000; 
     873                break; 
     874            case EVENT_SHADOWDEMON: 
     875                DoCast(m_creature, SPELL_SUMMON_SHADOWDEMON); 
     876                Timer[EVENT_SHADOWDEMON] = 0; 
     877                Timer[EVENT_FLAME_BURST] += 10000; 
     878                break; 
     879            case EVENT_FLAME_BURST: 
     880                DoCast(m_creature, SPELL_FLAME_BURST); 
     881                Timer[EVENT_FLAME_BURST] = 15000; 
     882                break; 
     883            case EVENT_TRANSFORM_DEMON: 
     884                EnterPhase(PHASE_TRANSFORM_SEQUENCE); 
     885                break; 
     886            default: 
     887                break; 
     888            } 
     889        } 
    939890    } 
    940891}; 
    941892 
    942893/********************************** End of Illidan AI ******************************************/ 
    943  
    944 //This is used to sort the players by distance in preparation for being charged by the flames. 
    945 struct TargetDistanceOrder : public std::binary_function<const Unit, const Unit, bool> 
    946 { 
    947     const Unit* MainTarget; 
    948     TargetDistanceOrder(const Unit* Target) : MainTarget(Target) {}; 
    949     // functor for operator ">" 
    950     bool operator()(const Unit* _Left, const Unit* _Right) const 
    951     { 
    952         return (MainTarget->GetDistance(_Left) > MainTarget->GetDistance(_Right)); 
    953     } 
    954 }; 
    955894 
    956895struct TRINITY_DLL_DECL flame_of_azzinothAI : public ScriptedAI 
     
    973912    void ChargeCheck() 
    974913    {         
    975         // Get the Threat List 
    976         std::list<HostilReference *> m_threatlist = m_creature->getThreatManager().getThreatList(); 
    977  
    978         if(!m_threatlist.size()) return; // He doesn't have anyone in his threatlist, useless to continue 
    979  
    980         std::list<Unit *> targets; 
    981         std::list<HostilReference *>::iterator itr = m_threatlist.begin(); 
    982         for( ; itr!= m_threatlist.end(); ++itr) //store the threat list in a different container 
    983         { 
    984             Unit *target = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid()); 
    985             if(target && target->isAlive() && target->GetTypeId() == TYPEID_PLAYER && target->GetPositionZ()>350) //only on alive players 
    986                 targets.push_back(target); 
    987         } 
    988  
    989         if (!targets.size()) 
    990             return; 
    991  
    992         //Sort the list of players 
    993         targets.sort(TargetDistanceOrder(m_creature)); 
    994         //Resize so we only get the furthest target 
    995         targets.resize(1); 
    996  
    997         Unit* target = (*targets.begin()); 
     914        Unit* target = SelectUnit(SELECT_TARGET_FARTHEST, 0, 200, false); 
    998915        if(target && (!m_creature->IsWithinDistInMap(target, FLAME_CHARGE_DISTANCE))) 
    999916        { 
     
    11291046        m_creature->SetUInt32Value(UNIT_NPC_FLAGS, 0); // Database sometimes has strange values.. 
    11301047        m_creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); 
     1048        m_creature->setActive(false); 
    11311049    } 
    11321050 
     
    11851103    void BeginChannel() 
    11861104    { 
     1105        m_creature->setActive(true); 
     1106 
    11871107        float x, y, z; 
    11881108        if(GETGO(Gate, GateGUID)) 
     
    15281448            m_creature->InterruptNonMeleeSpells(false); 
    15291449            m_creature->GetMotionMaster()->Clear(false); 
    1530             //m_creature->GetMotionMaster()->MoveIdle(); 
    15311450            m_creature->AttackStop(); 
    15321451            m_creature->SetUInt64Value(UNIT_FIELD_TARGET, IllidanGUID); 
     
    15581477        m_creature->InterruptNonMeleeSpells(false); 
    15591478        m_creature->GetMotionMaster()->Clear(false); 
    1560         //m_creature->GetMotionMaster()->MoveIdle(); 
    15611479        m_creature->Relocate(x, y, z); 
    15621480        m_creature->SendMonsterMove(x, y, z, 0, 0, 0); 
     
    18401758            if(!m_creature->getVictim()->HasAura(SPELL_PARASITIC_SHADOWFIEND, 0)) 
    18411759            { 
    1842                 m_creature->getVictim()->CastSpell(m_creature->getVictim(), SPELL_PARASITIC_SHADOWFIEND, true); //do not stack 
    1843                 if(GETCRE(Illidan, IllidanGUID)) 
    1844                     ((boss_illidan_stormrageAI*)Illidan->AI())->AddParasiteTarget(m_creature->getVictim()->GetGUID()); 
     1760                m_creature->getVictim()->CastSpell(m_creature->getVictim(), SPELL_PARASITIC_SHADOWFIEND, true, 0, 0, IllidanGUID); //do not stack 
    18451761            } 
    18461762            m_creature->AttackerStateUpdate(m_creature->getVictim()); 
     
    19371853}; 
    19381854 
    1939 struct TRINITY_DLL_DECL blazeAI : public ScriptedAI 
    1940 { 
    1941     blazeAI(Creature *c) : ScriptedAI(c) {Reset();} 
    1942  
    1943     uint32 BlazeTimer; 
    1944     uint32 DespawnTimer; 
    1945  
    1946     void Reset() 
    1947     { 
    1948         BlazeTimer = 3000;   
    1949         DespawnTimer = 60000; // Spell duration = 1 min 
    1950         //((TemporarySummon*)m_creature)->Summon(TEMPSUMMON_TIMED_DESPAWN, 0, false); 
    1951     } 
    1952  
    1953     void Aggro(Unit *who) {} 
    1954     void AttackStart(Unit* who) { } 
    1955     void MoveInLineOfSight(Unit *who){ } 
    1956  
    1957     void UpdateAI(const uint32 diff) 
    1958     { 
    1959         if(BlazeTimer) 
    1960             if(BlazeTimer <= diff) 
    1961             { 
    1962                 DoCast(m_creature, SPELL_BLAZE_EFFECT);//duration 60s 
    1963                 BlazeTimer = 0; 
    1964             }else BlazeTimer -= diff; 
    1965  
    1966         if(DespawnTimer < diff) 
    1967         { 
    1968             m_creature->SetVisibility(VISIBILITY_OFF); 
    1969             m_creature->setDeathState(JUST_DIED); 
    1970         }else DespawnTimer -= diff; 
    1971     } 
    1972 }; 
    1973  
    1974 struct TRINITY_DLL_DECL flamecrashAI : public ScriptedAI 
    1975 { 
    1976     flamecrashAI(Creature *c) : ScriptedAI(c) {Reset();} 
    1977  
    1978     uint32 DespawnTimer; 
    1979  
    1980     void Reset() 
    1981     { 
    1982         DoCast(m_creature, SPELL_FLAME_CRASH_EFFECT);//duration inf 
    1983         DespawnTimer = 120000; // summon spell duration 
    1984     } 
    1985  
    1986     void Aggro(Unit *who) {} 
    1987     void AttackStart(Unit *who) { } 
    1988     void MoveInLineOfSight(Unit *who){ } 
    1989  
    1990     void UpdateAI(const uint32 diff) 
    1991     { 
    1992         if(DespawnTimer < diff) 
    1993         { 
    1994             m_creature->SetVisibility(VISIBILITY_OFF); 
    1995             m_creature->setDeathState(JUST_DIED); 
    1996         }else DespawnTimer -= diff; 
    1997     } 
    1998 }; 
    1999  
    20001855struct TRINITY_DLL_DECL blade_of_azzinothAI : public ScriptedAI 
    20011856{ 
     
    20701925    FlightCount = 0; 
    20711926    TransformCount = 0; 
    2072  
    2073     ParasiteTargets.clear(); 
    20741927 
    20751928    m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, 21135); 
     
    20811934 
    20821935    m_creature->CastSpell(m_creature, SPELL_DUAL_WIELD, true); 
     1936    m_creature->setActive(false); 
    20831937} 
    20841938 
     
    23782232} 
    23792233 
    2380 CreatureAI* GetAI_flamecrash(Creature *_Creature) 
    2381 { 
    2382     return new flamecrashAI (_Creature); 
    2383 } 
    2384  
    23852234CreatureAI* GetAI_demonfire(Creature *_Creature) 
    23862235{ 
    23872236    return new demonfireAI (_Creature); 
    2388 } 
    2389  
    2390 CreatureAI* GetAI_blaze(Creature *_Creature) 
    2391 { 
    2392     return new blazeAI (_Creature); 
    23932237} 
    23942238 
     
    24502294 
    24512295    newscript = new Script; 
    2452     newscript->Name="mob_flame_crash"; 
    2453     newscript->GetAI = GetAI_flamecrash; 
    2454     m_scripts[nrscripts++] = newscript; 
    2455  
    2456     newscript = new Script; 
    24572296    newscript->Name="mob_demon_fire"; 
    24582297    newscript->GetAI = GetAI_demonfire; 
    2459     m_scripts[nrscripts++] = newscript; 
    2460  
    2461     newscript = new Script; 
    2462     newscript->Name="mob_blaze"; 
    2463     newscript->GetAI = GetAI_blaze; 
    24642298    m_scripts[nrscripts++] = newscript; 
    24652299 
  • trunk/src/bindings/scripts/scripts/zone/black_temple/boss_reliquary_of_souls.cpp

    r90 r178  
    635635    } 
    636636 
    637     void SelectSpiteTarget(uint32 num, float max_range = 999) 
    638     { 
    639         if(!num) return; 
    640  
    641         CellPair p(Trinity::ComputeCellPair(m_creature->GetPositionX(), m_creature->GetPositionY())); 
    642         Cell cell(p); 
    643         cell.data.Part.reserved = ALL_DISTRICT; 
    644         cell.SetNoCreate(); 
    645  
    646         std::list<Unit *> tempUnitMap; 
    647  
    648         { 
    649             Trinity::AnyAoETargetUnitInObjectRangeCheck u_check(m_creature, m_creature, max_range); 
    650             Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck> searcher(tempUnitMap, u_check); 
    651  
    652             TypeContainerVisitor<Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck>, WorldTypeMapContainer > world_unit_searcher(searcher); 
    653             TypeContainerVisitor<Trinity::UnitListSearcher<Trinity::AnyAoETargetUnitInObjectRangeCheck>, GridTypeMapContainer >  grid_unit_searcher(searcher); 
    654  
    655             CellLock<GridReadGuard> cell_lock(cell, p); 
    656             cell_lock->Visit(cell_lock, world_unit_searcher, *(m_creature->GetMap())); 
    657             cell_lock->Visit(cell_lock, grid_unit_searcher, *(m_creature->GetMap())); 
    658         } 
    659  
    660         std::list<Unit*>::iterator itr; 
    661         while(tempUnitMap.size() && SpiteTargetGUID.size() < num) 
    662         { 
    663             itr = tempUnitMap.begin(); 
    664             advance(itr, rand()%tempUnitMap.size()); 
    665             SpiteTargetGUID.push_back((*itr)->GetGUID()); 
    666             tempUnitMap.erase(itr); 
    667         } 
    668  
    669         for(itr = tempUnitMap.begin(); itr != tempUnitMap.end(); ++itr) 
    670             (*itr)->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); 
    671         m_creature->CastSpell(m_creature, SPELL_SPITE_TARGET, true); // must true 
    672         for(itr = tempUnitMap.begin(); itr != tempUnitMap.end(); ++itr) 
    673             (*itr)->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); 
    674     } 
    675  
    676637    void UpdateAI(const uint32 diff) 
    677638    { 
     
    701662        { 
    702663            DoCast(m_creature->getVictim(), SPELL_SOUL_SCREAM); 
    703             SoulScreamTimer = 10000; 
     664            SoulScreamTimer = 9000 + rand()%2000; 
    704665            if(!(rand()%3)) 
    705666            { 
     
    711672        if(SpiteTimer < diff) 
    712673        { 
    713             if(!SpiteTargetGUID.empty()) 
    714             { 
    715                 for (std::list<uint64>::iterator itr = SpiteTargetGUID.begin(); itr != SpiteTargetGUID.end(); ++itr) 
    716                 { 
    717                     if(Unit* target = Unit::GetUnit(*m_creature, *itr)) 
    718                     { 
    719                         target->RemoveAurasDueToSpell(SPELL_SPITE_TARGET); 
    720                         m_creature->CastSpell(target, SPELL_SPITE_DAMAGE, true); 
    721                     } 
    722                 } 
    723                 SpiteTargetGUID.clear(); 
    724                 SpiteTimer = 24000; 
    725             } 
    726             else 
    727             { 
    728                 SelectSpiteTarget(3); 
    729                 SpiteTimer = 6000; 
    730                 DoYell(ANGER_SAY_SPEC,LANG_UNIVERSAL,NULL); 
    731                 DoPlaySoundToSet(m_creature, ANGER_SOUND_SPEC); 
    732             } 
     674            DoCast(m_creature, SPELL_SPITE_TARGET); 
     675            SpiteTimer = 30000; 
     676            DoYell(ANGER_SAY_SPEC,LANG_UNIVERSAL,NULL); 
     677            DoPlaySoundToSet(m_creature, ANGER_SOUND_SPEC); 
    733678        }else SpiteTimer -= diff; 
    734679 
  • trunk/src/bindings/scripts/scripts/zone/black_temple/instance_black_temple.cpp

    r90 r178  
    11/* Copyright (C) 2006 - 2008 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/> 
    2  * This program is free software; you can redistribute it and/or modify 
    3  * it under the terms of the GNU General Public License as published by 
    4  * the Free Software Foundation; either version 2 of the License, or 
    5  * (at your option) any later version. 
    6  * 
    7  * This program is distributed in the hope that it will be useful, 
    8  * but WITHOUT ANY WARRANTY; without even the implied warranty of 
    9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
    10  * GNU General Public License for more details. 
    11  * 
    12  * You should have received a copy of the GNU General Public License 
    13  * along with this program; if not, write to the Free Software 
    14  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
    15  */ 
     2* This program is free software; you can redistribute it and/or modify 
     3* it under the terms of the GNU General Public License as published by 
     4* the Free Software Foundation; either version 2 of the License, or 
     5* (at your option) any later version. 
     6* 
     7* This program is distributed in the hope that it will be useful, 
     8* but WITHOUT ANY WARRANTY; without even the implied warranty of 
     9* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
     10* GNU General Public License for more details. 
     11* 
     12* You should have received a copy of the GNU General Public License 
     13* along with this program; if not, write to the Free Software 
     14* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
     15*/ 
    1616 
    1717/* ScriptData 
     
    5656    uint64 IllidanStormrage; 
    5757 
    58        uint16 BossKilled; 
     58    uint16 BossKilled; 
    5959 
    6060    uint64 NajentusGate; 
    6161    uint64 MainTempleDoors; 
    62        uint64 ShadeOfAkamaDoor; 
    63        uint64 CommonDoor;//Teron 
    64        uint64 TeronDoor; 
    65        uint64 GuurtogDoor; 
    66        uint64 MotherDoor; 
    67        uint64 TempleDoor;//Befor mother 
    68        uint64 CouncilDoor; 
    69        uint64 SimpleDoor;//council 
     62    uint64 ShadeOfAkamaDoor; 
     63    uint64 CommonDoor;//Teron 
     64    uint64 TeronDoor; 
     65    uint64 GuurtogDoor; 
     66    uint64 MotherDoor; 
     67    uint64 TempleDoor;//Befor mother 
     68    uint64 CouncilDoor; 
     69    uint64 SimpleDoor;//council 
    7070    uint64 IllidanGate; 
    7171    uint64 IllidanDoor[2]; 
    72  
    7372 
    7473    uint32 Encounters[ENCOUNTERS]; 
     
    8988        IllidanStormrage = 0; 
    9089 
    91                BossKilled = 0; 
     90        BossKilled = 0; 
    9291 
    9392        NajentusGate    = 0; 
    9493        MainTempleDoors = 0; 
    95                ShadeOfAkamaDoor= 0; 
    96                CommonDoor              = 0;//teron 
    97                TeronDoor               = 0; 
    98                GuurtogDoor             = 0; 
    99                MotherDoor              = 0; 
    100                TempleDoor              = 0; 
    101                SimpleDoor              = 0;//Bycouncil 
    102                CouncilDoor             = 0; 
     94        ShadeOfAkamaDoor= 0; 
     95        CommonDoor              = 0;//teron 
     96        TeronDoor               = 0; 
     97        GuurtogDoor             = 0; 
     98        MotherDoor              = 0; 
     99        TempleDoor              = 0; 
     100        SimpleDoor              = 0;//Bycouncil 
     101        CouncilDoor             = 0; 
    103102        IllidanGate     = 0; 
    104103        IllidanDoor[0]  = 0; 
     
    119118    void OpenDoor(uint64 DoorGUID, bool open) 
    120119    { 
    121         if(((InstanceMap*)instance)->GetPlayers().size()) 
    122             if(Player* first = ((InstanceMap*)instance)->GetPlayers().front()) 
    123                 if(GameObject *Door = GameObject::GetGameObject(*first, DoorGUID)) 
    124                     Door->SetUInt32Value(GAMEOBJECT_STATE, open ? 0 : 1); 
    125     } 
    126  
    127        void CloseDoor(uint64 DoorGUID, bool close) 
    128        { 
    129                if(((InstanceMap*)instance)->GetPlayers().size()) 
    130             if(Player* first = ((InstanceMap*)instance)->GetPlayers().front()) 
    131                 if(GameObject *Door = GameObject::GetGameObject(*first, DoorGUID)) 
    132                     Door->SetUInt32Value(GAMEOBJECT_STATE, close ? 1 : 0); 
    133        } 
    134  
    135  
     120        if(GameObject *Door = instance->GetGameObjectInMap(DoorGUID)) 
     121            Door->SetUInt32Value(GAMEOBJECT_STATE, open ? 0 : 1); 
     122    } 
     123 
     124    void CloseDoor(uint64 DoorGUID, bool close) 
     125    { 
     126        if(GameObject *Door = instance->GetGameObjectInMap(DoorGUID)) 
     127            Door->SetUInt32Value(GAMEOBJECT_STATE, close ? 1 : 0); 
     128    } 
    136129 
    137130    void OnCreatureCreate(Creature *creature, uint32 creature_entry) 
     
    139132        switch(creature_entry) 
    140133        { 
    141             case 22887:    Najentus = creature->GetGUID();                  break; 
    142             case 23089:    Akama = creature->GetGUID();                     break; 
    143             case 22990:    Akama_Shade = creature->GetGUID();               break; 
    144             case 22841:    ShadeOfAkama = creature->GetGUID();              break; 
    145             case 22898:    Supremus = creature->GetGUID();                  break; 
    146             case 22917:    IllidanStormrage = creature->GetGUID();          break; 
    147             case 22949:    GathiosTheShatterer = creature->GetGUID();       break; 
    148             case 22950:    HighNethermancerZerevor = creature->GetGUID();   break; 
    149             case 22951:    LadyMalande = creature->GetGUID();               break; 
    150             case 22952:    VerasDarkshadow = creature->GetGUID();           break; 
    151             case 23426:    IllidariCouncil = creature->GetGUID();           break; 
    152             case 23499:    BloodElfCouncilVoice = creature->GetGUID();      break; 
     134        case 22887:    Najentus = creature->GetGUID();                  break; 
     135        case 23089:    Akama = creature->GetGUID();                     break; 
     136        case 22990:    Akama_Shade = creature->GetGUID();               break; 
     137        case 22841:    ShadeOfAkama = creature->GetGUID();              break; 
     138        case 22898:    Supremus = creature->GetGUID();                  break; 
     139        case 22917:    IllidanStormrage = creature->GetGUID();          break; 
     140        case 22949:    GathiosTheShatterer = creature->GetGUID();       break; 
     141        case 22950:    HighNethermancerZerevor = creature->GetGUID();   break; 
     142        case 22951:    LadyMalande = creature->GetGUID();               break; 
     143        case 22952:    VerasDarkshadow = creature->GetGUID();           break; 
     144        case 23426:    IllidariCouncil = creature->GetGUID();           break; 
     145        case 23499:    BloodElfCouncilVoice = creature->GetGUID();      break; 
    153146        } 
    154147    } 
     
    158151        switch(go->GetEntry()) 
    159152        { 
    160             case 185483:                                    // Gate past Naj'entus (at the entrance to Supermoose's courtyards) 
    161                 NajentusGate = go->GetGUID();break; 
    162                        case 185882:                                    // Main Temple Doors - right past Supermoose (Supremus) 
    163                 MainTempleDoors = go->GetGUID();break; 
    164                        case 185478: 
    165                                ShadeOfAkamaDoor = go->GetGUID();break; 
    166                        case 185480:  
    167                                        CommonDoor = go->GetGUID();break; 
    168                        case 186153: 
    169                                TeronDoor = go->GetGUID();break; 
    170                        case 185892: 
    171                                GuurtogDoor = go->GetGUID();break; 
    172                        case 185479: 
    173                                TempleDoor = go->GetGUID();break; 
    174                        case 185482: 
    175                                MotherDoor = go->GetGUID();break; 
    176                        case 185481: 
    177                                CouncilDoor = go->GetGUID();break; 
    178                        case 186152://used by council 
    179                                SimpleDoor = go->GetGUID();break; 
    180                        case 185905:                                    // Gate leading to Temple Summit 
    181                 IllidanGate = go->GetGUID(); 
    182                 go->SetUInt32Value(GAMEOBJECT_FLAGS,GO_FLAG_NODESPAWN+GO_FLAG_INTERACT_COND); 
    183                 break; 
    184                        case 186261:                                    // Right door at Temple Summit 
    185                 IllidanDoor[0] = go->GetGUID(); 
    186                 go->SetUInt32Value(GAMEOBJECT_FLAGS,GO_FLAG_NODESPAWN+GO_FLAG_INTERACT_COND); 
    187                 break; 
    188                        case 186262:                                    // Left door at Temple Summit 
    189                 IllidanDoor[1] = go->GetGUID(); 
    190                 go->SetUInt32Value(GAMEOBJECT_FLAGS,GO_FLAG_NODESPAWN+GO_FLAG_INTERACT_COND); 
    191                 break; 
     153        case 185483:                                    // Gate past Naj'entus (at the entrance to Supermoose's courtyards) 
     154            NajentusGate = go->GetGUID();break; 
     155        case 185882:                                    // Main Temple Doors - right past Supermoose (Supremus) 
     156            MainTempleDoors = go->GetGUID();break; 
     157        case 185478: 
     158            ShadeOfAkamaDoor = go->GetGUID();break; 
     159        case 185480:  
     160            CommonDoor = go->GetGUID();break; 
     161        case 186153: 
     162            TeronDoor = go->GetGUID();break; 
     163        case 185892: 
     164            GuurtogDoor = go->GetGUID();break; 
     165        case 185479: 
     166            TempleDoor = go->GetGUID();break; 
     167        case 185482: 
     168            MotherDoor = go->GetGUID();break; 
     169        case 185481: 
     170            CouncilDoor = go->GetGUID();break; 
     171        case 186152://used by council 
     172            SimpleDoor = go->GetGUID();break; 
     173        case 185905:                                    // Gate leading to Temple Summit 
     174            IllidanGate = go->GetGUID(); 
     175            go->SetUInt32Value(GAMEOBJECT_FLAGS,GO_FLAG_NODESPAWN+GO_FLAG_INTERACT_COND); 
     176            break; 
     177        case 186261:                                    // Right door at Temple Summit 
     178            IllidanDoor[0] = go->GetGUID(); 
     179            go->SetUInt32Value(GAMEOBJECT_FLAGS,GO_FLAG_NODESPAWN+GO_FLAG_INTERACT_COND); 
     180            break; 
     181        case 186262:                                    // Left door at Temple Summit 
     182            IllidanDoor[1] = go->GetGUID(); 
     183            go->SetUInt32Value(GAMEOBJECT_FLAGS,GO_FLAG_NODESPAWN+GO_FLAG_INTERACT_COND); 
     184            break; 
    192185        } 
    193186    } 
     
    197190        switch(identifier) 
    198191        { 
    199             case DATA_HIGHWARLORDNAJENTUS:         return Najentus; 
    200             case DATA_AKAMA:                       return Akama; 
    201             case DATA_AKAMA_SHADE:                 return Akama_Shade; 
    202             case DATA_SHADEOFAKAMA:                return ShadeOfAkama; 
    203             case DATA_SUPREMUS:                    return Supremus; 
    204             case DATA_ILLIDANSTORMRAGE:            return IllidanStormrage; 
    205             case DATA_GATHIOSTHESHATTERER:         return GathiosTheShatterer; 
    206             case DATA_HIGHNETHERMANCERZEREVOR:     return HighNethermancerZerevor; 
    207             case DATA_LADYMALANDE:                 return LadyMalande; 
    208             case DATA_VERASDARKSHADOW:             return VerasDarkshadow; 
    209             case DATA_ILLIDARICOUNCIL:             return IllidariCouncil; 
    210             case DATA_GAMEOBJECT_NAJENTUS_GATE:    return NajentusGate; 
    211             case DATA_GAMEOBJECT_ILLIDAN_GATE:     return IllidanGate; 
    212             case DATA_GAMEOBJECT_ILLIDAN_DOOR_R:   return IllidanDoor[0]; 
    213             case DATA_GAMEOBJECT_ILLIDAN_DOOR_L:   return IllidanDoor[1]; 
    214             case DATA_GAMEOBJECT_SUPREMUS_DOORS:   return MainTempleDoors; 
    215             case DATA_BLOOD_ELF_COUNCIL_VOICE:     return BloodElfCouncilVoice; 
     192        case DATA_HIGHWARLORDNAJENTUS:         return Najentus; 
     193        case DATA_AKAMA:                       return Akama; 
     194        case DATA_AKAMA_SHADE:                 return Akama_Shade; 
     195        case DATA_SHADEOFAKAMA:                return ShadeOfAkama; 
     196        case DATA_SUPREMUS:                    return Supremus; 
     197        case DATA_ILLIDANSTORMRAGE:            return IllidanStormrage; 
     198        case DATA_GATHIOSTHESHATTERER:         return GathiosTheShatterer; 
     199        case DATA_HIGHNETHERMANCERZEREVOR:     return HighNethermancerZerevor; 
     200        case DATA_LADYMALANDE:                 return LadyMalande; 
     201        case DATA_VERASDARKSHADOW:             return VerasDarkshadow; 
     202        case DATA_ILLIDARICOUNCIL:             return IllidariCouncil; 
     203        case DATA_GAMEOBJECT_NAJENTUS_GATE:    return NajentusGate; 
     204        case DATA_GAMEOBJECT_ILLIDAN_GATE:     return IllidanGate; 
     205        case DATA_GAMEOBJECT_ILLIDAN_DOOR_R:   return IllidanDoor[0]; 
     206        case DATA_GAMEOBJECT_ILLIDAN_DOOR_L:   return IllidanDoor[1]; 
     207        case DATA_GAMEOBJECT_SUPREMUS_DOORS:   return MainTempleDoors; 
     208        case DATA_BLOOD_ELF_COUNCIL_VOICE:     return BloodElfCouncilVoice; 
    216209        } 
    217210 
     
    223216        switch(type) 
    224217        { 
    225             case DATA_HIGHWARLORDNAJENTUSEVENT:   Encounters[0] = data;                        break; 
    226             case DATA_SUPREMUSEVENT:              Encounters[1] = data;         break; 
    227             case DATA_SHADEOFAKAMAEVENT:          Encounters[2] = data;         break; 
    228             case DATA_TERONGOREFIENDEVENT:        Encounters[3] = data;         break; 
    229             case DATA_GURTOGGBLOODBOILEVENT:      Encounters[4] = data;         break; 
    230             case DATA_RELIQUARYOFSOULSEVENT:      Encounters[5] = data;         break; 
    231             case DATA_MOTHERSHAHRAZEVENT:         Encounters[6] = data;         break; 
    232             case DATA_ILLIDARICOUNCILEVENT:       Encounters[7] = data;         break; 
    233             case DATA_ILLIDANSTORMRAGEEVENT:      Encounters[8] = data;         break; 
     218        case DATA_HIGHWARLORDNAJENTUSEVENT:   Encounters[0] = data;                        break; 
     219        case DATA_SUPREMUSEVENT:              Encounters[1] = data;         break; 
     220        case DATA_SHADEOFAKAMAEVENT:          Encounters[2] = data;         break; 
     221        case DATA_TERONGOREFIENDEVENT:        Encounters[3] = data;         break; 
     222        case DATA_GURTOGGBLOODBOILEVENT:      Encounters[4] = data;         break; 
     223        case DATA_RELIQUARYOFSOULSEVENT:      Encounters[5] = data;         break; 
     224        case DATA_MOTHERSHAHRAZEVENT:         Encounters[6] = data;         break; 
     225        case DATA_ILLIDARICOUNCILEVENT:       Encounters[7] = data;         break; 
     226        case DATA_ILLIDANSTORMRAGEEVENT:      Encounters[8] = data;         break; 
    234227        } 
    235228 
    236229        if(data == DONE) 
    237                { 
     230        { 
    238231            SaveToDB(); 
    239                        BossKilled++; 
    240                } 
    241                CheckInstanceStatus(); 
    242     } 
    243  
    244        void CheckInstanceStatus() 
    245        { 
    246                if(BossKilled >= 6) 
    247                        OpenDoor(TempleDoor, true); 
    248                if(Encounters[0] == DONE) 
    249                        OpenDoor(NajentusGate, true); 
    250                if(Encounters[2] == IN_PROGRESS) 
    251                        CloseDoor(ShadeOfAkamaDoor, true); 
    252                else OpenDoor(ShadeOfAkamaDoor, true); 
    253                if(Encounters[3] == IN_PROGRESS) 
    254                { 
    255                        CloseDoor(TeronDoor, true); 
    256                        CloseDoor(CommonDoor, true); 
    257                }else{  
    258                        OpenDoor(TeronDoor, true); 
    259                        OpenDoor(CommonDoor, true); 
    260                } 
    261                if(Encounters[4] == DONE) 
    262                        OpenDoor(GuurtogDoor, true); 
    263                if(Encounters[6] == DONE) 
    264                        OpenDoor(MotherDoor, true); 
    265                if(Encounters[7] == IN_PROGRESS) 
    266                { 
    267                        CloseDoor(CouncilDoor, true); 
    268                        CloseDoor(SimpleDoor, true); 
    269                }else{ 
    270                        OpenDoor(CouncilDoor, true); 
    271                        OpenDoor(SimpleDoor, true);                      
    272                } 
    273        } 
     232            BossKilled++; 
     233        } 
     234        CheckInstanceStatus(); 
     235    } 
     236 
     237    void CheckInstanceStatus() 
     238    { 
     239        if(BossKilled >= 6) 
     240            OpenDoor(TempleDoor, true); 
     241        if(Encounters[0] == DONE) 
     242            OpenDoor(NajentusGate, true); 
     243        if(Encounters[2] == IN_PROGRESS) 
     244            CloseDoor(ShadeOfAkamaDoor, true); 
     245        else OpenDoor(ShadeOfAkamaDoor, true); 
     246        if(Encounters[3] == IN_PROGRESS) 
     247        { 
     248            CloseDoor(TeronDoor, true); 
     249            CloseDoor(CommonDoor, true); 
     250        }else{  
     251            OpenDoor(TeronDoor, true); 
     252            OpenDoor(CommonDoor, true); 
     253        } 
     254        if(Encounters[4] == DONE) 
     255            OpenDoor(GuurtogDoor, true); 
     256        if(Encounters[6] == DONE) 
     257            OpenDoor(MotherDoor, true); 
     258        if(Encounters[7] == IN_PROGRESS) 
     259        { 
     260            CloseDoor(CouncilDoor, true); 
     261            CloseDoor(SimpleDoor, true); 
     262        }else{ 
     263            OpenDoor(CouncilDoor, true); 
     264            OpenDoor(SimpleDoor, true);                      
     265        } 
     266    } 
    274267 
    275268    uint32 GetData(uint32 type) 
     
    277270        switch(type) 
    278271        { 
    279             case DATA_HIGHWARLORDNAJENTUSEVENT:         return Encounters[0]; 
    280             case DATA_SUPREMUSEVENT:                    return Encounters[1]; 
    281             case DATA_SHADEOFAKAMAEVENT:                return Encounters[2]; 
    282             case DATA_TERONGOREFIENDEVENT:              return Encounters[3]; 
    283             case DATA_GURTOGGBLOODBOILEVENT:            return Encounters[4]; 
    284             case DATA_RELIQUARYOFSOULSEVENT:            return Encounters[5]; 
    285             case DATA_MOTHERSHAHRAZEVENT:               return Encounters[6]; 
    286             case DATA_ILLIDARICOUNCILEVENT:             return Encounters[7]; 
    287             case DATA_ILLIDANSTORMRAGEEVENT:            return Encounters[8]; 
     272        case DATA_HIGHWARLORDNAJENTUSEVENT:         return Encounters[0]; 
     273        case DATA_SUPREMUSEVENT:                    return Encounters[1]; 
     274        case DATA_SHADEOFAKAMAEVENT:                return Encounters[2]; 
     275        case DATA_TERONGOREFIENDEVENT:              return Encounters[3]; 
     276        case DATA_GURTOGGBLOODBOILEVENT:            return Encounters[4]; 
     277        case DATA_RELIQUARYOFSOULSEVENT:            return Encounters[5]; 
     278        case DATA_MOTHERSHAHRAZEVENT:               return Encounters[6]; 
     279        case DATA_ILLIDARICOUNCILEVENT:             return Encounters[7]; 
     280        case DATA_ILLIDANSTORMRAGEEVENT:            return Encounters[8]; 
    288281        } 
    289282 
     
    320313        std::istringstream stream(in); 
    321314        stream >> Encounters[0] >> Encounters[1] >> Encounters[2] >> Encounters[3] 
    322             >> Encounters[4] >> Encounters[5] >> Encounters[6] >> Encounters[7] 
    323             >> Encounters[8]; 
     315        >> Encounters[4] >> Encounters[5] >> Encounters[6] >> Encounters[7] 
     316        >> Encounters[8]; 
    324317        for(uint8 i = 0; i < ENCOUNTERS; ++i) 
    325318            if(Encounters[i] == IN_PROGRESS)                // Do not load an encounter as "In Progress" - reset it instead.