Пример #1
0
    void Aggro(Unit *who)
    {
        //Close the room for boss fight
        if(pInstance)
            pInstance->SetData(ENCOUNT_ANUBREKHAN, IN_PROGRESS);

        switch(rand()%3)
        {
            case 0: DoScriptText(SAY_AGGRO1, m_creature); break;
            case 1: DoScriptText(SAY_AGGRO2, m_creature); break;
            case 2: DoScriptText(SAY_AGGRO3, m_creature); break;
        }
        CheckAch();
    }
Пример #2
0
    void Aggro(Unit* who)
    {
        // Cheaters must die =)
        blizzGuard1 = (TemporarySummon*)m_creature->SummonCreature(5764, BLIZZ_GUARDIAN1_X, BLIZZ_GUARDIAN1_Y, BLIZZ_GUARDIAN1_Z, BLIZZ_GUARDIAN1_O, TEMPSUMMON_MANUAL_DESPAWN, 120*IN_MILLISECONDS);
        blizzGuard2 = (TemporarySummon*)m_creature->SummonCreature(5764, BLIZZ_GUARDIAN2_X, BLIZZ_GUARDIAN2_Y, BLIZZ_GUARDIAN2_Z, BLIZZ_GUARDIAN2_O, TEMPSUMMON_MANUAL_DESPAWN, 120*IN_MILLISECONDS);  

        if(m_pInstance)
            m_pInstance->SetData(TYPE_HEIGAN, IN_PROGRESS);
        CheckAch();
        switch(rand()%3)
        {
            case 0:            DoScriptText(SAY_AGGRO1, m_creature);            break;
            case 1:            DoScriptText(SAY_AGGRO2, m_creature);            break;
            case 2:            DoScriptText(SAY_AGGRO3, m_creature);            break;
        }
        m_creature->SetInCombatWithZone();
    }
Пример #3
0
    void UpdateAI(const uint32 diff)
    {
        if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
            return;

        if (m_uiEvadeCheckCooldown < diff)
        {
            if (m_creature->GetDistance2d(3307.02f, -3476.27f) > 125.0f)
                EnterEvadeMode();
            m_uiEvadeCheckCooldown = 2000;
        }
        else
            m_uiEvadeCheckCooldown -= diff;

        //Berserk_Timer
        if (Berserk_Timer < diff)
        {
            DoCast(m_creature,SPELL_BERSERK);
            Berserk_Timer = 300000;
        }else Berserk_Timer -= diff;

        if (m_bIsRegularMode)
        {
            //SumonFirstCryptGuard_Timer
            if (SummonFirst_Timer < diff)
            {
                if (CryptGuard_count < MAX_CRYPT_GUARDS)
                    m_creature->SummonCreature(MOB_CRYPT_GUARD,3330.0f,-3477.0f,288.0f,3.2f,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,10000);
                SummonFirst_Timer = 2000000;
            }else SummonFirst_Timer -= diff;
        }

        //RiseFromCorpse_Timer
        if (RiseFromCorpse_Timer < diff)
        {
            RiseFromCorpse_Timer = 60000 + (rand()%10000);

            const Map::PlayerList &players = m_creature->GetMap()->GetPlayers();
            if (players.isEmpty())
                return;

            for(Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i)
                if (Player* pPlayer = i->getSource())
                {
                    if (pPlayer->isGameMaster())
                        continue;

                    if (pPlayer->isDead())
                        pPlayer->CastSpell(pPlayer,SPELL_SELF_SPAWN_5,true);
                }
        }else RiseFromCorpse_Timer -= diff;

        if(!swarm)
        {
            //Impale_Timer
            if (Impale_Timer < diff)
            {
                //Cast Impale on a random target
                //Do NOT cast it when we are afflicted by locust swarm
                if (!m_creature->HasAura(SPELL_LOCUSTSWARM,SpellEffectIndex(1)))
                    if (Unit* target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,SpellEffectIndex(1)))
                        DoCast(target,m_bIsRegularMode ? SPELL_IMPALE : SPELL_IMPALE_H);
                Impale_Timer = 15000;
            }else Impale_Timer -= diff;

            //LocustSwarm_Timer
            if (LocustSwarm_Timer < diff)
            {
                //Cast Locust Swarm buff on ourselves
                DoCast(m_creature, !m_bIsRegularMode ? SPELL_LOCUSTSWARM_H:SPELL_LOCUSTSWARM);
                swarm = true;
                //Summon Crypt Guard immidietly after Locust Swarm
                if (CryptGuard_count < MAX_CRYPT_GUARDS)
                    m_creature->SummonCreature(MOB_CRYPT_GUARD,3330.0f,-3477.0f,288.0f,3.2f,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,10000);
                LocustSwarm_Timer = 20000;
            }else LocustSwarm_Timer -= diff;
        }
        else
        {
            if (LocustSwarm_Timer < diff)
            {            
                swarm = false;
                LocustSwarm_Timer = 85000;
            }else LocustSwarm_Timer -= diff;
        }

        if (Ach_Timer<diff)
        {
            if (m_bIsRegularMode && m_ach_10ppl)
                CheckAch();
            else if (!m_bIsRegularMode && m_ach_25ppl)
                CheckAch();
            Ach_Timer = 10000;
        }else Ach_Timer -= diff;            

        DoMeleeAttackIfReady();
    }
Пример #4
0
    void UpdateAI(const uint32 diff)
    {
        if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
            return;

        if (Ach_Timer<diff)
        {
            CheckAch();
            Ach_Timer = 8000;
        }else Ach_Timer -= diff;

        //Don't let Heigan walk thru the door
        if (m_creature->GetPositionX()>2822 && m_creature->GetPositionY()>(-3700))
        {
            EnterEvadeMode();
            return;
        }
        if (m_creature->GetPositionY()<(-3739))
        {
            EnterEvadeMode();
            return;
        }
        //Slow Dance
        if (phase == 1)
        {
            if(phaseTimer < diff)
            {
                //Let's start fast dance
                phase = 2;
                //Teleport To Start Position
                //m_creature->NearTeleportTo(2793.86, -3707.38, 276.627, 0.593412);
                m_creature->GetMap()->CreatureRelocation(m_creature, 2793.86f, -3707.38f, 276.627f, 0.593412f);
                m_creature->SendMonsterMove(2793.86f, -3707.38f, 276.627f, SPLINETYPE_FACINGTARGET, SPLINEFLAG_NONE, 0);
                switch (rand()%5)
                {
                    case 0: DoScriptText(SAY_TAUNT1, m_creature); break;
                    case 1: DoScriptText(SAY_TAUNT2, m_creature); break;
                    case 2: DoScriptText(SAY_TAUNT3, m_creature); break;
                    case 3: DoScriptText(SAY_TAUNT4, m_creature); break;
                    case 4: DoScriptText(SAY_TAUNT5, m_creature); break;
                }
                //Cast channeling AOE
                DoCast(m_creature, SPELL_PLAGUECLOUD);
                phaseTimer = 45000;
                safeSpot = 1;
            }else phaseTimer-=diff;
            //Disease  all nearby players
            if(diseaseTimer < diff)
            {
                DoCast(m_creature, m_bIsRegularMode ? SPELL_FEAVER_H : SPELL_FEAVER);
                diseaseTimer=20000;
            }else diseaseTimer-=diff;
            //Debuff all players in 20 yard radius to 300% cast time
            if(disruptTimer < diff)
            {
                DoCast(m_creature, SPELL_DISRUPTION, false);
                disruptTimer = urand(5000, 10000);
            }else disruptTimer-=diff;

            DoMeleeAttackIfReady();
            
        }
        else if(phase == 2)
        {
            if(phaseTimer < diff)
            {
                switch (rand()%5)
                {
                    case 0: DoScriptText(SAY_TAUNT1, m_creature); break;
                    case 1: DoScriptText(SAY_TAUNT2, m_creature); break;
                    case 2: DoScriptText(SAY_TAUNT3, m_creature); break;
                    case 3: DoScriptText(SAY_TAUNT4, m_creature); break;
                    case 4: DoScriptText(SAY_TAUNT5, m_creature); break;
                }
                phase = 1;
                m_creature->GetMotionMaster()->Clear();
                m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
                AttackStart(m_creature->getVictim());
                phaseTimer = 90000;
                safeSpot = 1;
            }else phaseTimer-=diff;   
        }
    }