void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) { if (!IsHeroic()) return; if ((me->GetHealthPct() < 60.0f && me->GetHealthPct() > 20.0f && _phase < PHASE_FIRST_PLANAR) || (me->GetHealthPct() < 20.0f && _phase < PHASE_SECOND_PLANAR)) { events.Reset(); _phase = (me->GetHealthPct() < 60.0f && me->GetHealthPct() > 20.0f) ? PHASE_FIRST_PLANAR : PHASE_SECOND_PLANAR; DoCast(SPELL_PLANAR_SHIFT); // not sure about the amount, and if we should despawn previous spawns (dragon trashs) summons.DespawnAll(); //! TODO: TEST for (uint8 i = 0; i < 6; ++i) { Creature* summoned = me->SummonCreature(NPC_PLANAR_ANOMALY, *me, TEMPSUMMON_TIMED_DESPAWN, 15000); Unit* target = summoned->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); if (target && target->GetVehicleBase()) { summoned->CombatStart(target->GetVehicleBase(), true); summoned->AddThreat(target->GetVehicleBase(), 50000.0f); } summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_PACIFIED); summoned->SetDisplayId(11686); } } }
void EnterCombat(Unit* /*who*/) { if(!Feludius->isInCombat()) Feludius->CombatStart(me->getVictim(), 1.0f); events.ScheduleEvent(EVENT_BUNRING_BLOOD, urand(31000,33000)); events.ScheduleEvent(EVENT_FLAME_TORRENT, urand(10000,12000)); events.ScheduleEvent(EVENT_AEGIS_OF_FLAME, urand(54000,57000)); events.ScheduleEvent(EVENT_INFERNO_LEAP, urand(25000,27000)); }
void EnterCombat(Unit* /*who*/) { if(!Ignacious->isInCombat()) Ignacious->CombatStart(me->getVictim(), 1.0f); events.ScheduleEvent(EVENT_HYDROLANCE, urand(10000,12000)); events.ScheduleEvent(EVENT_WATER_BOMB, urand(16000,19000)); events.ScheduleEvent(EVENT_HEART_OF_ICE, urand(10000,12000)); events.ScheduleEvent(EVENT_GLACIATE, urand(32000,34000)); }
void DoIntro() { Creature* Madrigosa = Unit::GetCreature(*me, pInstance ? pInstance->GetData64(DATA_MADRIGOSA) : 0); if (!Madrigosa) return; float x, y, z, ground_Z; switch (IntroPhase) { case 0: me->SetFacingToObject(Madrigosa); Madrigosa->SetFacingToObject(me); IntroPhaseTimer = 1000; break; case 1: DoScriptText(YELL_MADR_ICE_BARRIER, Madrigosa); IntroPhaseTimer = 8000; break; case 2: DoScriptText(YELL_MADR_INTRO, Madrigosa, me); IntroPhaseTimer = 7000; break; case 3: DoScriptText(YELL_INTRO, me, Madrigosa); IntroPhaseTimer = 4000; break; case 4: Madrigosa->CombatStart(me, true); IntroAttackTimer = 2000; IntroPhaseTimer = 10000; break; case 5: me->AttackStop(); Madrigosa->AttackStop(); Madrigosa->SetSpeed(MOVE_RUN, 3.0f, true); Madrigosa->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); IntroPhaseTimer = 500; break; case 6: Madrigosa->GetMotionMaster()->MovePoint(0, Madrigosa->GetPositionX(), Madrigosa->GetPositionY() + 2, Madrigosa->GetPositionZ() + 8); IntroPhaseTimer = 2000; break; case 7: Madrigosa->SetInFront(me); Madrigosa->SendMovementFlagUpdate(); IntroAttackTimer = 3500; IntroFrostBoltTimer = 3500; IntroPhaseTimer = 13000; break; case 8: DoScriptText(YELL_INTRO_BREAK_ICE, me); IntroPhaseTimer = 5000; break; case 9: Madrigosa->SetWalk(true); Madrigosa->HandleEmoteCommand(EMOTE_ONESHOT_LAND); IntroPhaseTimer = 500; break; case 10: Madrigosa->GetPosition(x, y, z); ground_Z = me->GetMap()->GetHeight(x, y, MAX_HEIGHT, true); Madrigosa->GetMotionMaster()->MovePoint(1, x, y, ground_Z); IntroPhaseTimer = 2000; break; case 11: Madrigosa->SetInFront(me); Madrigosa->SendMovementFlagUpdate(); Madrigosa->CastSpell(me, SPELL_INTRO_ENCAPSULATE_CHANELLING, true); DoScriptText(YELL_MADR_TRAP, Madrigosa); DoCast(me, SPELL_INTRO_ENCAPSULATE); me->SetSpeed(MOVE_RUN, 4.0f, true); me->GetPosition(x, y, z); me->GetMotionMaster()->MovePoint(1, x - 6, y - 15, z + 10); IntroAttackTimer = 3000; IntroPhaseTimer = 6000; break; case 12: DoScriptText(YELL_INTRO_CHARGE, me); me->SetSpeed(MOVE_RUN, 3.0f, true); //me->GetMotionMaster()->MovePath(30000, false); me->GetPosition(x, y, z); ground_Z = me->GetMap()->GetHeight(x, y, MAX_HEIGHT, true); me->GetMotionMaster()->MovePoint(2, x + 6, y + 15, ground_Z); IntroPhaseTimer = 5000; break; case 13: me->Kill(Madrigosa); DoScriptText(YELL_MADR_DEATH, Madrigosa); me->SetSpeed(MOVE_RUN, 2.0f, true); IntroPhaseTimer = 7000; break; case 14: DoScriptText(YELL_INTRO_KILL_MADRIGOSA, me); me->SetSpeed(MOVE_RUN, 1.0f, true); Madrigosa->setDeathState(CORPSE); IntroPhaseTimer = 8000; break; case 15: DoScriptText(YELL_INTRO_TAUNT, me); IntroPhaseTimer = 5000; break; case 16: EndIntro(); break; } }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; if (CloseDoorTimer) { if (CloseDoorTimer <= diff) { if (pInstance) { pInstance->HandleGameObject(pInstance->GetData64(DATA_GO_LIBRARY_DOOR), false); CloseDoorTimer = 0; } } else CloseDoorTimer -= diff; } //Cooldowns for casts if (ArcaneCooldown) { if (ArcaneCooldown >= diff) ArcaneCooldown -= diff; else ArcaneCooldown = 2000; } if (FireCooldown) { if (FireCooldown >= diff) FireCooldown -= diff; else FireCooldown = 2000; } if (FrostCooldown) { if (FrostCooldown >= diff) FrostCooldown -= diff; else FrostCooldown = 2000; } if (!Drinking && me->GetMaxPower(POWER_MANA) && (me->GetPower(POWER_MANA) * 100 / me->GetMaxPower(POWER_MANA)) < 20) { Drinking = true; me->InterruptNonMeleeSpells(false); DoScriptText(SAY_DRINK, me); if (!DrinkInturrupted) { DoCast(me, SPELL_MASS_POLY, true); DoCast(me, SPELL_CONJURE, false); DoCast(me, SPELL_DRINK, false); me->SetStandState(UNIT_STAND_STATE_SIT); DrinkInturruptTimer = 10000; } } //Drink Inturrupt if (Drinking && DrinkInturrupted) { Drinking = false; me->RemoveAurasDueToSpell(SPELL_DRINK); me->SetStandState(UNIT_STAND_STATE_STAND); me->SetPower(POWER_MANA, me->GetMaxPower(POWER_MANA) - 32000); DoCast(me, SPELL_POTION, false); } //Drink Inturrupt Timer if (Drinking && !DrinkInturrupted) if (DrinkInturruptTimer >= diff) DrinkInturruptTimer -= diff; else { me->SetStandState(UNIT_STAND_STATE_STAND); DoCast(me, SPELL_POTION, true); DoCast(me, SPELL_AOE_PYROBLAST, false); DrinkInturrupted = true; Drinking = false; } //Don't execute any more code if we are drinking if (Drinking) return; //Normal casts if (NormalCastTimer <= diff) { if (!me->IsNonMeleeSpellCast(false)) { Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); if (!target) return; uint32 Spells[3]; uint8 AvailableSpells = 0; //Check for what spells are not on cooldown if (!ArcaneCooldown) { Spells[AvailableSpells] = SPELL_ARCMISSLE; ++AvailableSpells; } if (!FireCooldown) { Spells[AvailableSpells] = SPELL_FIREBALL; ++AvailableSpells; } if (!FrostCooldown) { Spells[AvailableSpells] = SPELL_FROSTBOLT; ++AvailableSpells; } //If no available spells wait 1 second and try again if (AvailableSpells) { CurrentNormalSpell = Spells[rand() % AvailableSpells]; SetImmune(false); DoCast(target, CurrentNormalSpell); } } NormalCastTimer = 2500; } else NormalCastTimer -= diff; if (SecondarySpellTimer <= diff) { switch (urand(0, 1)) { case 0: DoCast(me, SPELL_AOE_CS); break; case 1: if (Unit* pUnit = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(pUnit, SPELL_CHAINSOFICE); break; case 2: if (Unit* pUnit = SelectUnit(SELECT_TARGET_RANDOM, 0)) DoCast(pUnit, SPELL_DRAGONSBREATH); break; } SecondarySpellTimer = urand(3000, 8000); } else SecondarySpellTimer -= diff; if (SuperCastTimer <= diff) { uint8 Available[2]; switch (LastSuperSpell) { case SUPER_AE: Available[0] = SUPER_FLAME; Available[1] = SUPER_BLIZZARD; break; case SUPER_FLAME: Available[0] = SUPER_AE; Available[1] = SUPER_BLIZZARD; break; case SUPER_BLIZZARD: Available[0] = SUPER_FLAME; Available[1] = SUPER_AE; break; } LastSuperSpell = Available[urand(0, 1)]; SetImmune(true); Map::PlayerList const &PlayerList = pInstance->instance->GetPlayers(); WorldPacket data; switch (LastSuperSpell) { case SUPER_AE: DoScriptText(RAND(SAY_EXPLOSION1, SAY_EXPLOSION2), me); DoCast(me, SPELL_BLINK_CENTER, true); DoCast(me, SPELL_PLAYERPULL, true); DoCast(me, SPELL_MASSSLOW, true); DoCast(me, SPELL_ARCANE_BUBBLE, true); me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, true); me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_INTERRUPT, true); AETimer = 1500; CastAE = true; break; case SUPER_FLAME: DoScriptText(RAND(SAY_FLAMEWREATH1, SAY_FLAMEWREATH2), me); FlameWreathTimer = 20000; FlameWreathCheckTime = 500; FlameWreathTarget[0] = 0; FlameWreathTarget[1] = 0; FlameWreathTarget[2] = 0; FlameWreathEffect(); SecondarySpellTimer = 20500; break; case SUPER_BLIZZARD: DoScriptText(RAND(SAY_BLIZZARD1, SAY_BLIZZARD2), me); Creature* Blizzard = NULL; Blizzard = me->SummonCreature(NPC_ARAN_BLIZZARD, -11179.080f, -1905.279f, 232.008f, 2.9f, TEMPSUMMON_TIMED_DESPAWN, 25000); if (Blizzard) { Blizzard->SetInCombatWithZone(); Blizzard->SetFaction(me->GetFaction()); me->CastSpell(Blizzard, SPELL_SUMMON_BLIZZ, false); Blizzard->CastSpell(Blizzard, SPELL_CIRCULAR_BLIZZARD, false); Blizzard->GetMotionMaster()->MovePath(110110101, false); } break; } SuperCastTimer = urand(35000, 40000); } else SuperCastTimer -= diff; if (!ElementalsSpawned && HealthBelowPct(40)) { ElementalsSpawned = true; Creature* ElementalOne = NULL; Creature* ElementalTwo = NULL; Creature* ElementalThree = NULL; Creature* ElementalFour = NULL; ElementalOne = me->SummonCreature(NPC_WATER_ELEMENTAL, -11168.1f, -1939.29f, 232.092f, 1.46f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 90000); ElementalTwo = me->SummonCreature(NPC_WATER_ELEMENTAL, -11138.2f, -1915.38f, 232.092f, 3.00f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 90000); ElementalThree = me->SummonCreature(NPC_WATER_ELEMENTAL, -11161.7f, -1885.36f, 232.092f, 4.59f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 90000); ElementalFour = me->SummonCreature(NPC_WATER_ELEMENTAL, -11192.4f, -1909.36f, 232.092f, 6.19f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 90000); if (ElementalOne) { Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0); if (!pTarget) return; DoStartNoMovement(pTarget); ElementalOne->SetInCombatWithZone(); ElementalOne->CombatStart(pTarget); ElementalOne->SetFaction(me->GetFaction()); ElementalOne->SetRooted(true); ElementalOne->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true); ElementalOne->SetModifierValue(UNIT_MOD_RESISTANCE_FROST, BASE_VALUE, 0); } if (ElementalTwo) { Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0); if (!pTarget) return; DoStartNoMovement(pTarget); ElementalTwo->SetInCombatWithZone(); ElementalTwo->CombatStart(pTarget); ElementalTwo->SetFaction(me->GetFaction()); ElementalTwo->SetRooted(true); ElementalTwo->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true); ElementalTwo->SetModifierValue(UNIT_MOD_RESISTANCE_FROST, BASE_VALUE, 0); } if (ElementalThree) { Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0); if (!pTarget) return; DoStartNoMovement(pTarget); ElementalThree->SetInCombatWithZone(); ElementalThree->CombatStart(pTarget); ElementalThree->SetFaction(me->GetFaction()); ElementalThree->SetRooted(true); ElementalThree->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true); ElementalThree->SetModifierValue(UNIT_MOD_RESISTANCE_FROST, BASE_VALUE, 0); } if (ElementalFour) { Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0); if (!pTarget) return; DoStartNoMovement(pTarget); ElementalFour->SetInCombatWithZone(); ElementalFour->CombatStart(pTarget); ElementalFour->SetFaction(me->GetFaction()); ElementalFour->SetRooted(true); ElementalFour->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FROST, true); ElementalFour->SetModifierValue(UNIT_MOD_RESISTANCE_FROST, BASE_VALUE, 0); } DoScriptText(SAY_ELEMENTALS, me); DoScriptText(SAY_TIMEOVER, me); BerserkTimer = 60000; } else BerserkTimer -= diff; //Flame Wreath check if (FlameWreathTimer) { if (FlameWreathTimer >= diff) FlameWreathTimer -= diff; else FlameWreathTimer = 0; if (FlameWreathCheckTime <= diff) { for (uint8 i = 0; i < 3; ++i) { if (!FlameWreathTarget[i]) continue; Unit* unit = Unit::GetUnit(*me, FlameWreathTarget[i]); if (unit && !unit->IsWithinDist2d(FWTargPosX[i], FWTargPosY[i], 3)) { unit->CastSpell(unit, 20476, true, 0, 0, me->GetGUID()); unit->CastSpell(unit, 11027, true); FlameWreathTarget[i] = 0; } } FlameWreathCheckTime = 500; } else FlameWreathCheckTime -= diff; } if (ArcaneCooldown && FireCooldown && FrostCooldown && DragonsbreathCooldown) DoMeleeAttackIfReady(); if (CastAE) if (AETimer < diff) { me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, true); me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_INTERRUPT, true); me->CastSpell(me, SPELL_AEXPLOSION, false); AETimer = 1500; CastAE = false; } else AETimer -= diff; }
void DoIntro() { Creature *Madrigosa = Unit::GetCreature(*me, pInstance ? pInstance->GetData64(DATA_MADRIGOSA) : 0); if (!Madrigosa) return; switch (IntroPhase) { case 0: IntroPhaseTimer = 1000; break; case 1: DoScriptText(YELL_MADR_ICE_BARRIER, Madrigosa); IntroPhaseTimer = 8000; break; case 2: DoScriptText(YELL_MADR_INTRO, Madrigosa, me); Madrigosa->SetReactState(REACT_PASSIVE); IntroPhaseTimer = 7000; break; case 3: DoScriptText(YELL_INTRO, me, Madrigosa); me->SetInFront(Madrigosa); Madrigosa->SetInFront(me); IntroPhaseTimer = 4000; break; case 4: Madrigosa->CombatStart(me, true); IntroAttackTimer = 2000; IntroPhaseTimer = 10000; break; case 5: me->AttackStop(); Madrigosa->AttackStop(); Madrigosa->SetUnitMovementFlags(MOVEFLAG_LEVITATING | MOVEFLAG_ONTRANSPORT); Madrigosa->SetSpeed(MOVE_RUN, 3.0f, true); Madrigosa->GetMotionMaster()->MovePath(31000, false); Madrigosa->SetInFront(me); IntroAttackTimer = 3500; IntroFrostBoltTimer = 3500; IntroPhaseTimer = 13000; break; case 6: Madrigosa->SetPosition(Madrigosa->GetPositionX(),Madrigosa->GetPositionY(),Madrigosa->GetPositionZ(),4.1f,true); DoScriptText(YELL_INTRO_BREAK_ICE, me); IntroPhaseTimer = 6000; break; case 7: Madrigosa->SetUnitMovementFlags(MOVEFLAG_NONE); Madrigosa->CastSpell(me, 45661, true); DoScriptText(YELL_MADR_TRAP, Madrigosa); DoCast(me, SPELL_INTRO_ENCAPSULATE); me->SetSpeed(MOVE_RUN, 4.0f, true); me->GetMotionMaster()->MovePoint(0,1494.691895, 548.588989, 39.162289); me->SetPosition(1494.691895, 548.588989, 25.652, 1.34f, true); IntroAttackTimer = 3000; IntroPhaseTimer = 6000; break; case 8: DoScriptText(YELL_INTRO_CHARGE, me); me->SetSpeed(MOVE_RUN, 3.0f, true); me->GetMotionMaster()->MovePath(30000, false); IntroPhaseTimer = 4000; break; case 9: me->DealDamage(Madrigosa, Madrigosa->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, true); DoScriptText(YELL_MADR_DEATH, Madrigosa); me->SetHealth(me->GetMaxHealth()); me->AttackStop(); me->SetSpeed(MOVE_RUN, 2.0f, true); IntroPhaseTimer = 7000; break; case 10: DoScriptText(YELL_INTRO_KILL_MADRIGOSA, me); me->StopMoving(); me->SetSpeed(MOVE_RUN, 1.0f, true); me->GetMotionMaster()->MovePoint(0, me->GetPositionX()+3,me->GetPositionY(),me->GetPositionZ()); me->SetPosition(me->GetPositionX()+3,me->GetPositionY(),me->GetPositionZ(), 1.1, false); Madrigosa->setDeathState(CORPSE); IntroPhaseTimer = 8000; break; case 11: DoScriptText(YELL_INTRO_TAUNT, me); IntroPhaseTimer = 5000; break; case 12: EndIntro(); break; } }