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); }
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); }
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; } }
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); } }