void UpdateAI(const uint32 diff)
    {
        if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
            return;

        switch(getStage())
        {
            case 0: // Bone Slice and single Coldflames phase
            {
                if (timedQuery(SPELL_BONE_SPIKE, diff))
                {
                    if (Unit* pTarget = doSelectRandomPlayer(SPELL_BONE_SPIKE_IMPALE, false, 60.0f, isHeroic()))
                    {
                        doCast(pTarget, SPELL_BONE_SPIKE);
                        DoSummonSpike(pTarget);
                        DoScriptText(-1631003 - urand(0,2), m_creature, pTarget);
                    }
                }

                if (timedQuery(SPELL_BONE_STORM, diff))
                    setStage(1);

                if (timedQuery(SPELL_CALL_COLD_FLAME, diff))
                    doCast(SPELL_CALL_COLD_FLAME);

                if (m_uiSliceTimer <= 1000)
                {
                    if (m_uiSliceTimer <= diff)
                    {
                        doCast(SPELL_BONE_SLICE, m_creature->getVictim());
                        m_uiSliceTimer = 1000;
                    }
                    else
                        m_uiSliceTimer -= diff;
                }
                else
                    m_uiSliceTimer -= diff;

                DoMeleeAttackIfReady();
                break;
            }
            case 1: // Bone Storm initialization phase
            {
                m_creature->InterruptNonMeleeSpells(true);
                doCast(SPELL_BONE_STORM);
                DoScriptText(-1631002,m_creature);
                SetCombatMovement(false);
                m_creature->GetMotionMaster()->Clear();
                m_creature->SetSpeedRate(MOVE_RUN, 3);
                // initial X Coldflames are in Marrowgar's place
                m_creature->GetPosition(targetPosX, targetPosY, targetPosZ);
                setStage(2);
                break;
            }
            case 2: // Bone Storm waiting to end casting the spell
            {
                if (!m_creature->IsNonMeleeSpellCasted(false))
                    setStage(3);
                break;
            }
            case 3: // Whirling in Bone Storm and casting Cold Flames
            {
                if (isHeroic())
                {
                    if (timedQuery(SPELL_BONE_SPIKE, diff))
                    {
                        if (Unit* pTarget = doSelectRandomPlayer(SPELL_BONE_SPIKE_IMPALE, false, 60.0f, isHeroic()))
                        {
                            doCast(pTarget, SPELL_BONE_SPIKE);
                            DoSummonSpike(pTarget);
                            DoScriptText(-1631003 - urand(0,2), m_creature, pTarget);
                        }
                    }
                }

                if (m_creature->GetDistance2d(targetPosX, targetPosY) < 5.0f)
                {
                    if (!m_bIsColdFlameXCast)
                    {
                        
                        float myPosX, myPosY, myPosZ;

                        m_creature->GetPosition(myPosX, myPosY, myPosZ);

                        m_pInstance->SetData(DATA_DIRECTION, (uint32)(1000*2.0f*M_PI_F*((float)urand(1,16)/16.0f)));
                        doCast(SPELL_CALL_COLD_FLAME);
                        doSummon(NPC_COLD_FLAME, myPosX, myPosY, myPosZ);

                        if (++m_uiColdFlameCounter >= 4 + isHeroic())
                        {
                            doRemove(SPELL_BONE_STORM_STRIKE);
                            doRemove(SPELL_BONE_STORM);
                        }
                        m_bIsColdFlameXCast = true;
                    }

                    if (m_uiBoneStormChargeTimer <= diff)
                    {
                        if (Unit* pTarget = doSelectRandomPlayerAtRange(60.0f))
                        {
                            pTarget->GetPosition(targetPosX, targetPosY, targetPosZ);
                            m_creature->GetMotionMaster()->MovePoint(0, targetPosX, targetPosY, targetPosZ);
                            m_bIsColdFlameXCast = false;
                            m_uiBoneStormChargeTimer = 3000;
                        }
                    }
                    else
                        m_uiBoneStormChargeTimer -= diff;
                }

                if (!hasAura(SPELL_BONE_STORM_STRIKE, m_creature) && !hasAura(SPELL_BONE_STORM, m_creature))
                    setStage(4);

                break;
            }
            case 4:
            {
                m_pInstance->SetData(DATA_DIRECTION, 0);
                m_creature->SetSpeedRate(MOVE_RUN, 1);
                m_uiColdFlameCounter = 0;
                SetCombatMovement(true);
                m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
                m_uiSliceTimer = 10000;
                setStage(0);
                break;
            }
            default:
                break;
        }

        if (timedQuery(SPELL_BERSERK, diff))
        {
            doCast(SPELL_BERSERK);
            DoScriptText(-1631008, m_creature);
        }
    }
Esempio n. 2
0
    void UpdateAI(const uint32 diff)
    {
        if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
            return;

        switch(getStage())
        {
            case 0: 
                    if (timedQuery(SPELL_BONE_STRIKE, diff))
                        if (Unit* pTarget = doSelectRandomPlayer(SPELL_BONE_STRIKE_IMPALE, false, 60.0f))
                            if (doCast(SPELL_BONE_STRIKE, pTarget) == CAST_OK)
                            {
                                doSummonSpike(pTarget);
                                switch (urand(0,1)) {
                                                   case 0:
                                                   DoScriptText(-1631003,m_creature,pTarget);
                                                   break;
                                                   case 1:
                                                   DoScriptText(-1631004,m_creature,pTarget);
                                                   break;
                                                   case 2:
                                                   DoScriptText(-1631005,m_creature,pTarget);
                                                   break;
                                                   };

                            };

                    if (timedQuery(SPELL_BONE_STORM, diff)) setStage(1);

                    if (timedQuery(SPELL_CALL_COLD_FLAME, diff))
                    {
                        if (urand(0,1)) doCast(SPELL_CALL_COLD_FLAME);
                            else  doCast(SPELL_CALL_COLD_FLAME_1);

                        if (m_creature->GetHealthPercent() <= 30.0f)
                        {
                            if (urand(0,1)) doCast(SPELL_CALL_COLD_FLAME);
                                else  doCast(SPELL_CALL_COLD_FLAME_1);
                        }
                    }

                    timedCast(SPELL_SABER_LASH, diff);

                    DoMeleeAttackIfReady();

                    break;
            case 1:
                    m_creature->InterruptNonMeleeSpells(true);
                    doCast(SPELL_BONE_STORM);
                    setStage(2);
                    DoScriptText(-1631002,m_creature);
                    DoResetThreat();
                    m_creature->RemoveSplineFlag(SPLINEFLAG_WALKMODE);
                    m_creature->SetSpeedRate(MOVE_RUN, 3);
                    m_creature->SetSpeedRate(MOVE_WALK, 3);
                    break;
            case 2:
                    if (!m_creature->IsNonMeleeSpellCasted(false)) setStage(3);
                    break;
            case 3:
                    if (isHeroic())
                        if (timedQuery(SPELL_BONE_STRIKE, diff, true))
                            if (Unit* pTarget = doSelectRandomPlayer(SPELL_BONE_STRIKE_IMPALE, false, 60.0f))
                                doSummonSpike(pTarget);

                    if (timedQuery(SPELL_CALL_COLD_FLAME, diff, true)
                        && m_creature->IsWithinDistInMap(m_creature->getVictim(),2.0f))
                    {
                        pInstance->SetData(DATA_DIRECTION, (uint32)(1000*2.0f*M_PI_F*((float)urand(1,16)/16.0f)));
//                        if (urand(0,1)) doCast(SPELL_CALL_COLD_FLAME);
//                            else  doCast(SPELL_CALL_COLD_FLAME_1);
                        float fPosX, fPosY, fPosZ;
                        m_creature->GetPosition(fPosX, fPosY, fPosZ);
                        doSummon(NPC_COLD_FLAME, fPosX, fPosY, fPosZ);
                        DoResetThreat();
                        if (Unit* pTarget = doSelectRandomPlayerAtRange(60.0f))
                            AttackStart(pTarget);
                    }
                    if (!hasAura(SPELL_BONE_STORM_STRIKE, m_creature) && !hasAura(SPELL_BONE_STORM, m_creature)) setStage(4);
                    break;
            case 4:
                    pInstance->SetData(DATA_DIRECTION, 0);
                    m_creature->SetSpeedRate(MOVE_RUN, 1);
                    m_creature->SetSpeedRate(MOVE_WALK, 1);
//                    m_creature->AddSplineFlag(SPLINEFLAG_WALKMODE);
                    setStage(0);
                    break;
            default:
                    break;
            }

        if (timedQuery(SPELL_BERSERK, diff))
            {
                doCast(SPELL_BERSERK);
                DoScriptText(-1631008,m_creature);
            }


    }
    void OnCreatureCreate(Creature* pCreature)
    {
        switch(pCreature->GetEntry())
        {
            case NPC_MARROWGAR: 
				m_uiMarrowgarGUID = pCreature->GetGUID();
				if(!pCreature->isAlive())
					SetData(TYPE_MARROWGAR,DONE);
				break;
            case NPC_DEATHWHISPER: 
				m_uiDeathwhisperGUID = pCreature->GetGUID();
				if(!pCreature->isAlive())
					SetData(TYPE_DEATHWHISPER,DONE);
				break;
            case NPC_SAURFANG: 
				m_uiSaurfangGUID = pCreature->GetGUID();
				if(!pCreature->isAlive())
				{
					m_auiEncounter[TYPE_SAURFANG] = DONE;
					OpenDoor(m_uiSaurfangDoorGUID);
				}
				break;
			case NPC_FESTERGUT:
				if(isHeroic())	AutoFreeze(pCreature);
				m_uiFestergutGUID = pCreature->GetGUID();
				if(!pCreature->isAlive())
					SetData(TYPE_FESTERGUT,DONE);
				break;
			case NPC_ROTFACE:
				if(isHeroic())	AutoFreeze(pCreature);
				m_uiRotfaceGUID = pCreature->GetGUID();
				if(!pCreature->isAlive())
					SetData(TYPE_ROTFACE,DONE);
				break;
			case NPC_PUTRICIDE:
				m_uiPutricideGUID = pCreature->GetGUID();
				if(!pCreature->isAlive())
					SetData(TYPE_PUTRICIDE,DONE);
				AutoFreeze(pCreature);
				if(isHeroic())	AutoFreeze(pCreature);
				break;
			case NPC_PRINCE_KELESETH:
				m_uiPrinceKelesethGUID = pCreature->GetGUID();
				if(isHeroic())	AutoFreeze(pCreature);
				break;
			case NPC_PRINCE_VALANAR:
				m_uiPrinceValanarGUID = pCreature->GetGUID();
				if(isHeroic())	AutoFreeze(pCreature);
				if(!pCreature->isAlive())
					SetData(TYPE_PRINCE_COUNCIL,DONE);
				break;
			case NPC_PRINCE_TALDARAM:
				m_uiPrinceTaldaramGUID = pCreature->GetGUID();
				if(isHeroic())	AutoFreeze(pCreature);
				break;
			case NPC_LANATHEL:
				m_uiLanathelGUID = pCreature->GetGUID();
				if(isHeroic())	AutoFreeze(pCreature);
				if(!pCreature->isAlive())
					SetData(TYPE_LANATHEL,DONE);
				break;
			case NPC_DREAMWALKER:
				m_uiDreamWalkerGUID = pCreature->GetGUID();
				if(isHeroic())	AutoFreeze(pCreature);
				if(GetData(TYPE_DREAMWALKER) == DONE)
					pCreature->ForcedDespawn(100);
				break;
			case NPC_SINDRAGOSA:
				m_uiSindragosaGUID = pCreature->GetGUID();
				if(isHeroic())	AutoFreeze(pCreature);
				if(!pCreature->isAlive())
					SetData(TYPE_SINDRAGOSA,DONE);
				break;
			case NPC_LICHKING:
				m_uiLichKingGUID = pCreature->GetGUID();
				if(isHeroic())	AutoFreeze(pCreature);
				break;
			case 37006:
				rotfacePoolsGUIDs.push_back(pCreature->GetGUID());
				break;
			case 38422:
			case 38458:
			case 38454:
			case 38369:
				vortexGUIDs.push_back(pCreature->GetGUID());
				break;
			case 38186:
			case 38068:
			case 37934:
			case 37907:
			case 37886:
			case 37863:
			case 36791:
				dreamwalkerAddsGUIDs.push_back(pCreature->GetGUID());
				break;
			case 37868:
				if(pCreature->GetDBTableGUIDLow() == 0)
					dreamwalkerAddsGUIDs.push_back(pCreature->GetGUID());
				else
				{
					if(GetData(TYPE_DREAMWALKER) == DONE)
						pCreature->ForcedDespawn(100);
					dreamwalkerEventAddGUIDs.push_back(pCreature->GetGUID());
				}
				break;
			case NPC_DREAMWALKER_IMAGE:
				pCreature->SetPhaseMask(16,true);
				m_uiDreamwalkerImageGUID = pCreature->GetGUID();
				break;
			case NPC_TIRION_FORDRING:
				m_uiFordringLKEventGUID = pCreature->GetGUID();
				break;

        }
    }