Exemplo n.º 1
0
    void Reset()
    {
        // Remove immunity
        m_creature->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_ALL, false);

        m_uiPhase = PHASE_SPEECH;
        m_uiSpeech = 1;

        m_uiTraineeTimer = 24 * IN_MILLISECONDS;
        m_uiDeathKnightTimer = 74 * IN_MILLISECONDS;
        m_uiRiderTimer = 134 * IN_MILLISECONDS;
        m_uiTeleportTimer = urand(30000, 45000); // Teleport every 30-45 seconds.
        m_uiShadowboltTimer = 2 * IN_MILLISECONDS;
        m_uiHarvestSoulTimer = 2500;
        m_uiPhaseTimer = 3 * MINUTE * IN_MILLISECONDS + 44 * IN_MILLISECONDS; // last summon at 3:44 - Teleport down at 4:34
        m_uiControlZoneTimer = urand(120 * IN_MILLISECONDS, 150 * IN_MILLISECONDS);
        m_uiSpeechTimer = 1 * IN_MILLISECONDS;

        // Despawn Adds
        for (GUIDList::const_iterator itr = m_lSummonedAddGuids.begin(); itr != m_lSummonedAddGuids.end(); itr++)
        {
            if (Creature* pCreature = m_creature->GetMap()->GetCreature(*itr))
                pCreature->ForcedDespawn();
        }

        m_lSummonedAddGuids.clear();
        m_lTraineeSummonPosGuids.clear();
        m_lDeathKnightSummonPosGuids.clear();
        m_lRiderSummonPosGuids.clear();
    }
    // Unsummon Majordomo adds
    void UnsummonMajordomoAdds()
    {
        for (GUIDList::const_iterator itr = m_luiMajordomoAddsGUIDs.begin(); itr != m_luiMajordomoAddsGUIDs.end(); ++itr)
        {
            if (Creature* pAdd = m_creature->GetMap()->GetCreature(*itr))
                if (pAdd->IsTemporarySummon())
                    ((TemporarySummon*)pAdd)->UnSummon();
        }

        m_luiMajordomoAddsGUIDs.clear();
    }
Exemplo n.º 3
0
    void DespawnOrKillAdds(bool bDespawn)
    {
        for (GUIDList::const_iterator itr = m_lSummonedAddGuids.begin(); itr != m_lSummonedAddGuids.end(); ++itr)
        {
            if (Creature* pAdd = m_creature->GetMap()->GetCreature(*itr))
            {
                if (bDespawn)
                    pAdd->ForcedDespawn();
                else
                {
                    pAdd->SetDeathState(JUST_DIED);
                    pAdd->SetHealth(0);
                }
            }
        }

        m_lSummonedAddGuids.clear();
    }
    void JustDied(Unit* pKiller)
    {
        DoScriptText(SAY_DEATH, m_creature);

        if (m_pInstance)
        {
            m_pInstance->SetData(TYPE_TRIBUNAL, FAIL);
            // Continue at right state after respawn
            if (m_bHasContinued)
                m_pInstance->SetData(TYPE_TRIBUNAL, IN_PROGRESS);
        }

        for (GUIDList::const_iterator itr = m_luiDwarfGUIDs.begin(); itr != m_luiDwarfGUIDs.end(); ++itr)
        {
            if (Creature* pDwarf = m_creature->GetMap()->GetCreature(*itr))
                pDwarf->ForcedDespawn();
        }
        m_luiDwarfGUIDs.clear();
    }
Exemplo n.º 5
0
    void UpdateAI(const uint32 uiDiff)
    {
        if (!m_creature->SelectHostileTarget() || !m_creature->getVictim() || m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == POINT_MOTION_TYPE)
            return;

        if (m_uiMark_Count >= 100)
            if (m_uiEnrage_Timer < uiDiff)
            {
                m_creature->InterruptNonMeleeSpells(false);
                DoCast(m_creature, SPELL_BERSERK, true);
                m_uiEnrage_Timer = 300000;
            }
            else
                m_uiEnrage_Timer -= uiDiff;

        // Mark of Blaumeux
        if (m_uiMark_Timer < uiDiff)
        {
            DoCastSpellIfCan(m_creature,SPELL_MARK_OF_BLAUMEUX,CAST_TRIGGERED);
            m_uiMark_Timer = 15000;
            m_uiMark_Count++;
        }
        else 
            m_uiMark_Timer -= uiDiff;

        // Shield Wall - All 4 horsemen will shield wall at 50% hp and 20% hp for 20 seconds
        if (m_bShieldWall1 && m_creature->GetHealthPercent() < 50.0f)
        {
            if (m_bShieldWall1)
            {
                DoCastSpellIfCan(m_creature,SPELL_SHIELDWALL);
                m_bShieldWall1 = false;
            }
        }
        else if (m_bShieldWall2 && m_creature->GetHealthPercent() < 20.0f)
        {
            if (m_bShieldWall2)
            {
                DoCastSpellIfCan(m_creature,SPELL_SHIELDWALL);
                m_bShieldWall2 = false;
            }
        }

        // Void Zone
        if (m_uiVoidZone_Timer < uiDiff)
        {
            // get random player in 45yard range (maybe this can be done easier?)
            ThreatList const& tList = m_creature->getThreatManager().getThreatList();

            if(!tList.empty())
            {
                GUIDList lClosePlayerList;
                lClosePlayerList.clear();

                for (ThreatList::const_iterator itr = tList.begin();itr != tList.end(); ++itr)
                    if(Unit* pUnit = m_creature->GetMap()->GetUnit((*itr)->getUnitGuid()))
                        if (m_creature->GetDistance2d(pUnit) < 45.f)
                            lClosePlayerList.push_back(pUnit->GetGUID());

                if(!lClosePlayerList.empty())
                {
                    GUIDList::iterator i = lClosePlayerList.begin();
                    advance(i, (rand() % lClosePlayerList.size()));
                    if(Player* pTarget = m_creature->GetMap()->GetPlayer(*i))
                        DoCastSpellIfCan(pTarget, m_bIsRegularMode ? SPELL_VOIDZONE : H_SPELL_VOIDZONE, CAST_TRIGGERED);
                }
            }
            m_uiVoidZone_Timer = 12000;
        }
        else 
            m_uiVoidZone_Timer -= uiDiff;

        if (m_uiShadowBolt_Timer < uiDiff)
        {
            // cast on closest player
            ThreatList const& tList = m_creature->getThreatManager().getThreatList();
            if (!tList.empty())
            {
                Unit* pTarget = m_creature->GetMap()->GetUnit((*tList.begin())->getUnitGuid());
                for (ThreatList::const_iterator itr = tList.begin();itr != tList.end(); ++itr)
                    if (Unit* pUnit = m_creature->GetMap()->GetUnit((*itr)->getUnitGuid()))
                        if (pTarget && m_creature->GetDistance2d(pUnit) < m_creature->GetDistance2d(pTarget))
                            pTarget = pUnit;
                if (pTarget && m_creature->GetDistance2d(pTarget)< 45.0f)
                    DoCast(pTarget, m_bIsRegularMode ? SPELL_SHADOW_BOLT : H_SPELL_SHADOW_BOLT, true);
                else
                    DoCast(m_creature, SPELL_UNYIELDING_PAIN, true);
            }
            m_uiShadowBolt_Timer = 2000;
        }
        else
            m_uiShadowBolt_Timer -= uiDiff;

        DoMeleeAttackIfReady();
    }