Пример #1
0
    void Reset()
    {
        Phase = 0;

        FlyPhase(Phase, 3000);
	bFlyPhaseTimer = 40000;
	uiTimer = 0;
	StunTimer = 0;
	SpawnHarpoonTimer = 60000;
        FlameBreathTimer = 20000;
        DevouringFlameTimer = 6000;
        FuseArmorTimer = 15000;
        FlameBuffetTimer = 3000;
        SummonAddsTimer = 8000;
        WingBuffetTimer = 17000;
        FireballTimer = 18000;

        InitialSpawn = false;
        IsFlying = false;
	bFly = false;
	bFlyPhase1 = false;

        me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
        me->ApplySpellImmune(1, IMMUNITY_EFFECT,SPELL_EFFECT_ATTACK_ME, true);
    }
Пример #2
0
    void Reset()
    {
        Phase = 1;

        FlyPhase(Phase, 0);

        FlameBreathTimer = 20000;
        DevouringFlameTimer = 2000;
        FuseArmorTimer = 15000;
        FlameBuffetTimer = 3000;
        SummonAddsTimer = 45000;
        WingBuffetTimer = 17000;
        FireballTimer = 18000;
        //StunTimer = 30000;
        //CastSpellsTimer = 0;

        InitialSpawn = true;
        IsFlying = true;

        m_creature->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
        m_creature->ApplySpellImmune(1, IMMUNITY_EFFECT,SPELL_EFFECT_ATTACK_ME, true);
    }
Пример #3
0
    void UpdateAI(const uint32 diff)
    {
        if (!UpdateVictim())
            return;

        if (m_creature->GetPositionY() > -60 || m_creature->GetPositionX() < 450) // Not Blizzlike, anti-exploit to prevent players from pulling bosses to vehicles.
        {
            m_creature->RemoveAllAuras();
            m_creature->DeleteThreatList();
            m_creature->CombatStop(false);
            m_creature->GetMotionMaster()->MoveTargetedHome();
        }

        // Victim is not controlled by a player (should never happen)
        if (m_creature->getVictim() && !m_creature->getVictim()->GetCharmerOrOwnerPlayerOrPlayerItself())
            m_creature->Kill(m_creature->getVictim());

        if ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 99 && Phase == 1) // TODO: Only land (exit Phase 1) if brought down with harpoon guns! This is important!
        {
            Phase = 2;
            DoScriptText(SAY_PHASE_2_TRANS, m_creature); // Audio: "Move quickly! She won't remain grounded for long!"
        }

        if ((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 33 && Phase == 2) // Health under 33%, Razorscale can't fly anymore.
        {
            Phase = 3;
            DoScriptText(SAY_PHASE_3_TRANS, m_creature); // "Razorscale lands permanently!"
            // TODO: Cast Devouring Flame on all harpoon guns simultaneously, briefly after Phase 3 starts (lasts until the harpoon guns are destroyed)
        }

        /*
        if (Phase == 2 && CastSpellsTimer > 0) // 5 seconds of spell casting, after stun breaks, during Phase 2
        {
            if (CastSpellsTimer <= diff)       // 5 seconds are up
                Phase = 1;                     // Return to phase 1
            else
                CastSpellsTimer -= diff;
        }*/

        FlyPhase(Phase, diff);

        if (Phase >= 2) // Ground Phase (Phase 3 = permanent ground phase)
        {
            if (FuseArmorTimer <= diff)
            {
                DoCastVictim(SPELL_FUSEARMOR);
                FuseArmorTimer = 10000;
            } else FuseArmorTimer -= diff;

            if (WingBuffetTimer <= diff)
            {
                DoCast(SPELL_WINGBUFFET);
                WingBuffetTimer = urand(7000,14000);
            } else WingBuffetTimer -= diff;

            if (FireballTimer <= diff)
            {
                if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 200, true))
                {
                    m_creature->SetInFront(pTarget);
                    DoCast(pTarget, SPELL_FIREBALL);
                }

                FireballTimer = 18000;
            } else FireballTimer -= diff;

            if (FlameBreathTimer <= diff)
            {
                DoScriptText(EMOTE_BREATH, m_creature); // TODO: "Razorscale takes a deep breath..."
                DoCastVictim(SPELL_FLAMEBREATH);
                FlameBreathTimer = 15000;
                WingBuffetTimer = 0;
            } else FlameBreathTimer -= diff;

            if (Phase == 3)
            {
                if (FlameBuffetTimer <= diff)
                {
                    DoScriptText(EMOTE_BREATH, m_creature);
                    std::list<Unit*> pTargets;
                    SelectTargetList(pTargets, RAID_MODE(3,9), SELECT_TARGET_RANDOM, 100, true);
                    uint8 i = 0;
                    for (std::list<Unit*>::iterator itr = pTargets.begin(); itr != pTargets.end();)
                    {
                        if (m_creature->HasInArc(M_PI, *itr))
                        {
                            DoCast(*itr, SPELL_FLAMEBUFFET, true);
                            ++i;
                        }
                        if (++itr == pTargets.end() || i == RAID_MODE(3,9))
                        {
                            AttackStart(*--itr); // seems to attack targets randomly during perma-ground phase..
                            break;
                        }
                    }
                    FlameBuffetTimer = 25000;
                } else FlameBuffetTimer -= diff;
            }

            DoMeleeAttackIfReady();
        }
        else if (Phase == 1) //Flying Phase
        {
            if (InitialSpawn)
                SummonAdds();

            InitialSpawn = false;

            if (FireballTimer <= diff)
            {
                if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 200, true))
                {
                    m_creature->SetInFront(pTarget);
                    DoCast(pTarget, SPELL_FIREBALL);
                }

                FireballTimer = 18000;
            } else FireballTimer -= diff;

            if (DevouringFlameTimer <= diff)
            {
                if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 200, true))
                {
                    m_creature->SetInFront(pTarget);
                    DoCast(pTarget, SPELL_DEVOURINGFLAME);
                }

                DevouringFlameTimer = 10000;
            } else DevouringFlameTimer -= diff;

            if (SummonAddsTimer <= diff)
                SummonAdds();
            else SummonAddsTimer -= diff;
        }
    }
Пример #4
0
    void UpdateAI(const uint32 diff)
    {
        if (!UpdateVictim())
            return;
	Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM,0);
	if (!pTarget)
	return;

        if(me->GetPositionY() > -60 || me->GetPositionX() < 450) // Not Blizzlike, anti-exploit to prevent players from pulling bosses to vehicles.
        {
            me->RemoveAllAuras();
            me->DeleteThreatList();
            me->CombatStop(false);
            me->GetMotionMaster()->MoveTargetedHome();
        }

        if (me->getVictim() && !me->getVictim()->GetCharmerOrOwnerPlayerOrPlayerItself())
            me->Kill(me->getVictim());
	    
	if ((me->GetHealth()*100 / me->GetMaxHealth()) < 90 && Phase == 0)
        {
	Phase = 1;
	bFly = true;
	}

        if ((me->GetHealth()*100 / me->GetMaxHealth()) < 50 && Phase == 1)
        {
	    me->RemoveAllAuras();
	    Phase = 2;
	    InitialSpawn = false;
	    if (IsFlying)
		{
		    me->SetFlying(false);
                    me->GetMotionMaster()->MoveTargetedHome();
		    IsFlying = false;
		    me->SetReactState(REACT_AGGRESSIVE);
		    me->SendMovementFlagUpdate();
		}
            DoScriptText(SAY_PHASE_2_TRANS, me); 
        }

        if ((me->GetHealth()*100 / me->GetMaxHealth()) < 33 && Phase == 2)
        {
            Phase = 3;
            DoScriptText(SAY_PHASE_3_TRANS, me);
        }

        if (Phase >= 2)
        {
            if (FuseArmorTimer <= diff)
            {
                DoCastVictim(SPELL_FUSEARMOR);
                FuseArmorTimer = 10000;
            } else FuseArmorTimer -= diff;

            if (WingBuffetTimer <= diff)
            {
                DoCast(SPELL_WINGBUFFET);
                WingBuffetTimer = urand(27000,34000);
            } else WingBuffetTimer -= diff;

            if (FireballTimer <= diff)
            {
                if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 200, true))
                {
                    me->SetInFront(pTarget);
                    DoCast(pTarget, SPELL_FIREBALL);
                }
                FireballTimer = 18000;
            } else FireballTimer -= diff;

            if (Phase == 3)
            {
                if (FlameBuffetTimer <= diff)
                {
                    DoScriptText(EMOTE_BREATH, me);
                    std::list<Unit*> pTargets;
                    SelectTargetList(pTargets, RAID_MODE(3,9), SELECT_TARGET_RANDOM, 100, true);
                    uint8 i = 0;
                    for (std::list<Unit*>::const_iterator itr = pTargets.begin(); itr != pTargets.end();)
                    {
                        if (me->HasInArc(M_PI, *itr))
                        {
                            DoCast(*itr, SPELL_FLAMEBUFFET, true);
                            ++i;
                        }
                        if (++itr == pTargets.end() || i == RAID_MODE(3,9))
                        {
                            AttackStart(*--itr);
                            break;
                        }
			if (!i)
			return;
                    }
                    FlameBuffetTimer = 25000;
                } else FlameBuffetTimer -= diff;
		
		if (FlameBreathTimer <= diff)
		{
                DoScriptText(EMOTE_BREATH, me);
                DoCastVictim(SPELL_FLAMEBREATH);
                FlameBreathTimer = 15000;
		} else FlameBreathTimer -= diff;
	  }
	  DoMeleeAttackIfReady();
        }
        else if (Phase == 1)
        {
	     if (bFly)
	     {
		FlyPhase(Phase, diff);
		SummonAddsTimer = 8000;
		bFly = false;
	     }
	     
	     Creature* pSpellHitt;
		pSpellHitt = NULL;
    
	     if (pSpellHitt = me->FindNearestCreature(NPC_VISUAL_HITT, 5.0f, true))
	     {
	            me->GetMotionMaster()->MoveTargetedHome();
		    me->SetFlying(false);
		    me->SendMovementFlagUpdate();
		    IsFlying = false;
		    bFlyPhase1 = true;
		    bFlyPhaseTimer = 35000;
		    bFly = false;
		    InitialSpawn = false;
		    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
		    StunTimer = 2000;
		}
		 if (!bFly && bFlyPhase1 && !IsFlying && StunTimer <= diff)
		    {
		    DoCast(me,SPELL_STUN);
		    StunTimer = 2000;
		    } else StunTimer -= diff;
	     
	     if (bFlyPhase1 && bFlyPhaseTimer <= diff)
		    {
		    me->RemoveAllAuras();
		    me->SetReactState(REACT_AGGRESSIVE);
		    me->SendMovementFlagUpdate();
		    DoScriptText(EMOTE_BREATH, me);
		    DoCastVictim(SPELL_FLAMEBREATH);
		    DoCast(SPELL_WINGBUFFET);
		    bFlyPhaseTimer = 40000;
		    SpawnHarpoonTimer = 60000;
		    bFly = true;
		    bFlyPhase1 = false;
		    } else bFlyPhaseTimer -= diff;

            if (FireballTimer <= diff)
            {
                if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 200, true))
                {
                    me->SetInFront(pTarget);
                    DoCast(pTarget, SPELL_FIREBALL);
                }
                FireballTimer = 12000;
            } else FireballTimer -= diff;

            if (DevouringFlameTimer <= diff)
            {
                if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 200, true))
                {
                    me->SetInFront(pTarget);
                    DoCast(pTarget, DEVOURING_FLAME_VISUAL);
                }
                DevouringFlameTimer = 6000;
            } else DevouringFlameTimer -= diff;
	    
	    if (InitialSpawn)
	    {
              if (SummonAddsTimer <= diff)
	      {
                SummonAdds();
		InitialSpawn = true;
	      } else SummonAddsTimer -= diff;
	    }
	    
	    if (InitialSpawn && SpawnHarpoonTimer <= diff)
	    {
	    if (pInstance)
	    pInstance->SetData(DATA_HARPOON, pInstance->GetData(DATA_HARPOON)+1);
	    //if(!GetClosestGameObjectWithEntry(me, GO_BROKEN_HARPOON, 200.0f))
	      //if (GameObject* pGo = me->SummonGameObject(GO_BROKEN_HARPOON, 607.613, -134.207, 391.297, 4.10138, 0, 0, 0, 0,0))
		 
	    SpawnHarpoonTimer = 60000;
	    } else SpawnHarpoonTimer -= diff;
	    
	    //EnterEvadeIfOutOfCombatArea(diff);
        }
    }