void StartEvent(Unit* who)
        {
            GetAdvisors();

            Talk(SAY_AGGRO);
            DoZoneInCombat();

            instance->SetGuidData(DATA_KARATHRESSEVENT_STARTER, who->GetGUID());
            instance->SetData(DATA_KARATHRESSEVENT, IN_PROGRESS);
        }
    void Aggro(Unit* pWho)
    {
        if (!m_pInstance)
            return;

        GetAdvisors();

        DoScriptText(SAY_AGGRO, m_creature);

        m_pInstance->SetData64(DATA_KARATHRESS_STARTER, pWho->GetGUID());
        m_pInstance->SetData(TYPE_KARATHRESS_EVENT, IN_PROGRESS);
    }
        void StartEvent(Unit *who)
        {
            if (!pInstance)
                return;

            GetAdvisors();

            DoScriptText(SAY_AGGRO, me);
            DoZoneInCombat();

            pInstance->SetData64(DATA_KARATHRESSEVENT_STARTER, who->GetGUID());
            pInstance->SetData(DATA_KARATHRESSEVENT, IN_PROGRESS);
        }
    void Aggro(Unit* pWho)
    {
        if (!m_pInstance)
            return;

        GetAdvisors();

        DoScriptText(SAY_AGGRO, m_creature);

        if (Player* pPlayer = pWho->GetCharmerOrOwnerPlayerOrPlayerItself())
        {
            m_pInstance->SetData64(DATA_KARATHRESS_STARTER, pPlayer->GetGUID());
            m_pInstance->SetData(TYPE_KARATHRESS_EVENT, IN_PROGRESS);
        }
    }
        void UpdateAI(const uint32 diff)
        {
            //Only if not incombat check if the event is started
            if (!me->isInCombat() && pInstance && pInstance->GetData(DATA_KARATHRESSEVENT))
            {
                Unit *pTarget = Unit::GetUnit((*me), pInstance->GetData64(DATA_KARATHRESSEVENT_STARTER));

                if (pTarget)
                {
                    AttackStart(pTarget);
                    GetAdvisors();
                }
            }

            //Return since we have no target
            if (!UpdateVictim())
                return;

            //someone evaded!
            if (pInstance && !pInstance->GetData(DATA_KARATHRESSEVENT))
            {
                EnterEvadeMode();
                return;
            }

            //CataclysmicBolt_Timer
            if (CataclysmicBolt_Timer <= diff)
            {
                //select a random unit other than the main tank
                Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 1);

                //if there aren't other units, cast on the tank
                if (!pTarget)
                    pTarget = me->getVictim();

                if (pTarget)
                    DoCast(pTarget, SPELL_CATACLYSMIC_BOLT);
                CataclysmicBolt_Timer = 10000;
            } else CataclysmicBolt_Timer -= diff;

            //SearNova_Timer
            if (SearNova_Timer <= diff)
            {
                DoCast(me->getVictim(), SPELL_SEAR_NOVA);
                SearNova_Timer = 20000+rand()%40000;
            } else SearNova_Timer -= diff;

            //Enrage_Timer
            if (Enrage_Timer <= diff)
            {
                DoCast(me, SPELL_ENRAGE);
                Enrage_Timer = 90000;
            } else Enrage_Timer -= diff;

            //Blessing of Tides Trigger
            if (!HealthAbovePct(75) && !BlessingOfTides)
            {
                BlessingOfTides = true;
                bool continueTriggering = false;
                Creature* Advisor;
                for (uint8 i = 0; i < MAX_ADVISORS; ++i)
                    if (Advisors[i])
                    {
                        Advisor = (Unit::GetCreature(*me, Advisors[i]));
                        if (Advisor && Advisor->isAlive())
                        {
                            continueTriggering = true;
                            break;
                        }
                    }
                if (continueTriggering)
                {
                    DoCast(me, SPELL_BLESSING_OF_THE_TIDES);
                    me->MonsterYell(SAY_GAIN_BLESSING_OF_TIDES, LANG_UNIVERSAL, NULL);
                    DoPlaySoundToSet(me, SOUND_GAIN_BLESSING_OF_TIDES);
                }
            }

            DoMeleeAttackIfReady();
        }
    void UpdateAI(const uint32 uiDiff)
    {
        //Return since we have no target
        if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
        {
            //check if the event is started
            if (m_pInstance && m_pInstance->GetData(TYPE_KARATHRESS_EVENT) == IN_PROGRESS)
            {
                if (Unit* pTarget = Unit::GetUnit((*m_creature), m_pInstance->GetData64(DATA_KARATHRESS_STARTER)))
                {
                    AttackStart(pTarget);
                    GetAdvisors();
                }
            }
            return;
        }

        //someone evaded!
        if (m_pInstance && m_pInstance->GetData(TYPE_KARATHRESS_EVENT) == NOT_STARTED)
        {
            EnterEvadeMode();
            return;
        }

        //m_uiCataclysmicBolt_Timer
        if (m_uiCataclysmicBolt_Timer < uiDiff)
        {
            //select a random unit other than the main tank
            Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 1);

            //if there aren't other units, cast on the tank
            if (!pTarget)
                pTarget = m_creature->getVictim();

            m_creature->CastSpell(pTarget, SPELL_CATACLYSMIC_BOLT, false);

            m_uiCataclysmicBolt_Timer = 10000;
        }else m_uiCataclysmicBolt_Timer -= uiDiff;

        //hp under 75%
        if (!m_bBlessingOfTides_MobsChecked && ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth())  <= 75))
        {
            for(uint8 i = 0; i < MAX_ADVISORS; ++i)
            {
                if (Unit* pAdvisor = Unit::GetUnit(*m_creature, m_auiAdvisorsGUID[i]))
                {
                    //stack max three times (one for each alive)
                    if (pAdvisor->isAlive())
                    {
                        pAdvisor->InterruptNonMeleeSpells(false);
                        pAdvisor->CastSpell(m_creature, SPELL_BLESSING_OF_THE_TIDES, false);
                    }
                }
            }

            //yell if we now have the aura
            if (m_creature->HasAura(SPELL_BLESSING_OF_THE_TIDES))
                DoScriptText(SAY_GAIN_BLESSING, m_creature);

            m_bBlessingOfTides_MobsChecked = true;
        }

        //m_uiEnrage_Timer
        if (m_uiEnrage_Timer < uiDiff)
        {
            DoCast(m_creature, SPELL_ENRAGE);
            m_uiEnrage_Timer = 90000;
        }else m_uiEnrage_Timer -= uiDiff;

        DoMeleeAttackIfReady();
    }
    void UpdateAI(const uint32 uiDiff)
    {
        //Return since we have no target
        if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
        {
            //check if the event is started
            if (m_pInstance && m_pInstance->GetData(TYPE_KARATHRESS_EVENT) == IN_PROGRESS)
            {
                if (Unit* pTarget = Unit::GetUnit((*m_creature), m_pInstance->GetData64(DATA_KARATHRESS_STARTER)))
                {
                    AttackStart(pTarget);
                    GetAdvisors();
                }
            }
            return;
        }

        //someone evaded!
        if (m_pInstance && m_pInstance->GetData(TYPE_KARATHRESS_EVENT) == NOT_STARTED)
        {
            EnterEvadeMode();
            return;
        }

        //m_uiCataclysmicBolt_Timer
		//Spell musi byc rzucany na target z mana i nie na tanka, chyba ze w threat znajduje sie tylko 1 osoba wtedy na nia
		//Jesli ktos ma lepszy pomysl na rozwiazanie tego problemu zapraszam do zmiany tej kiszkowatej implementacji :S
        if (m_uiCataclysmicBolt_Timer < uiDiff)
        {
			Unit* pTarget;
			uint8 k = 1; //8bitow - max 25ppl

			std::list<HostileReference*>& m_threatlist = m_creature->getThreatManager().getThreatList();
			std::list<HostileReference*>::iterator i = m_threatlist.begin();
			
			for (i = m_threatlist.begin(); i!= m_threatlist.end();++i)
			{
				error_log("Debug:Fathom Lord Karrathes - petla Cataclysmic Bolt"); // Do usuniecia jesli wszytsko bedzie dzialalo poprawnie

				pTarget = SelectUnit(SELECT_TARGET_RANDOM, k);// zaczyna od 2 osoby w threat (k=1) - czyli nigdy nie bedzie to tank, chyba ze bedzie solo
				if (!pTarget) //proba solowania (niezaleznie czy ma mane czy nie zwraca aktualny target jako poprawny target)
				{
                pTarget = m_creature->getVictim();
					break;
				}

				if(pTarget && pTarget->getPowerType() == POWER_MANA)
					break;

				++k; //inkrementacja pozycji w threat
			}

            m_creature->CastSpell(pTarget, SPELL_CATACLYSMIC_BOLT, false);
            m_uiCataclysmicBolt_Timer = 10000;
        }else m_uiCataclysmicBolt_Timer -= uiDiff;

        //hp under 75%
        if (!m_bBlessingOfTides_MobsChecked && ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth())  <= 75))
        {
            for(uint8 i = 0; i < MAX_ADVISORS; ++i)
            {
                if (Unit* pAdvisor = Unit::GetUnit(*m_creature, m_auiAdvisorsGUID[i]))
                {
                    //stack max three times (one for each alive)
                    if (pAdvisor->isAlive())
                    {
                        m_creature->InterruptNonMeleeSpells(false);
                        m_creature->CastSpell(m_creature, SPELL_BLESSING_OF_THE_TIDES, true);
                    }
                }
            }

            //yell if we now have the aura
            if (m_creature->HasAura(SPELL_BLESSING_OF_THE_TIDES))
                DoScriptText(SAY_GAIN_BLESSING, m_creature);

            m_bBlessingOfTides_MobsChecked = true;
        }

        //m_uiEnrage_Timer
        if (m_uiEnrage_Timer < uiDiff)
        {
            DoCast(m_creature, SPELL_ENRAGE);
            m_uiEnrage_Timer = 90000;
        }else m_uiEnrage_Timer -= uiDiff;

        DoMeleeAttackIfReady();
    }
Exemplo n.º 8
0
    void UpdateAI(const uint32 uiDiff)
    {
        //Return since we have no target
        if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
        {
            //check if the event is started
            if (m_pInstance && m_pInstance->GetData(TYPE_KARATHRESS_EVENT) == IN_PROGRESS)
            {
                if (Player* pTarget = m_creature->GetMap()->GetPlayer(m_pInstance->GetData64(DATA_KARATHRESS_STARTER)))
                {
                    AttackStart(pTarget);
                    GetAdvisors();
                }
            }
            return;
        }

        //someone evaded!
        if (m_pInstance && m_pInstance->GetData(TYPE_KARATHRESS_EVENT) == NOT_STARTED)
        {
            EnterEvadeMode();
            return;
        }

        //m_uiCataclysmicBolt_Timer
        if (m_uiCataclysmicBolt_Timer < uiDiff)
        {
            Unit* pTarget;

            ThreatList const& m_threatlist = m_creature->getThreatManager().getThreatList();
            if (m_threatlist.empty())
                return;
            
            for (ThreatList::const_iterator itr = m_threatlist.begin(); itr!= m_threatlist.end();++itr)
            {
                if (Unit* pTemp = m_creature->GetMap()->GetUnit((*itr)->getUnitGuid()))
                {
                    //player and has mana
                    if ((pTemp->GetTypeId() == TYPEID_PLAYER) && (pTemp->getPowerType() == POWER_MANA))
                    {
                        pTarget = pTemp;
                        break;
                    }
                }
            }
            // in case no player with mana or victim is not a player choose current victim
            if (!pTarget)
                pTarget = m_creature->getVictim();
            if (!pTarget)
                return;

            m_creature->CastSpell(pTarget, SPELL_CATACLYSMIC_BOLT, false);
            m_uiCataclysmicBolt_Timer = 10000;
        }else m_uiCataclysmicBolt_Timer -= uiDiff;

        //hp under 75%
        if (!m_bBlessingOfTides_MobsChecked && m_creature->GetHealthPercent() < 75.0f)
        {
            for(uint8 i = 0; i < MAX_ADVISORS; ++i)
            {
                if (Creature* pAdvisor = m_creature->GetMap()->GetCreature(m_auiAdvisorsGUID[i]))
                {
                    //stack max three times (one for each alive)
                    if (pAdvisor->isAlive())
                    {
                        m_creature->InterruptNonMeleeSpells(false);
                        m_creature->CastSpell(m_creature, SPELL_BLESSING_OF_THE_TIDES, true);
                    }
                }
            }

            //yell if we now have the aura
            if (m_creature->HasAura(SPELL_BLESSING_OF_THE_TIDES))
                DoScriptText(SAY_GAIN_BLESSING, m_creature);

            m_bBlessingOfTides_MobsChecked = true;
        }

        //m_uiEnrage_Timer
        if (m_uiEnrage_Timer < uiDiff)
        {
            DoCastSpellIfCan(m_creature, SPELL_ENRAGE);
            m_uiEnrage_Timer = 90000;
        }else m_uiEnrage_Timer -= uiDiff;

        DoMeleeAttackIfReady();
    }