void UpdateAI(const uint32 diff) { //Return since we have no target if (!UpdateVictim()) return; switch (Phase) { case TROLL: if (uiPhaseCounter == 2) { if (uiTransformationTimer <= diff) { me->SetDisplayId(DISPLAY_RHINO); Phase = RHINO; uiPhaseCounter = 0; DoScriptText(SAY_TRANSFORM_1, me); uiTransformationTimer = 5*IN_MILLISECONDS; bStartOfTransformation = true; me->ClearUnitState(UNIT_STAT_STUNNED|UNIT_STAT_ROOT); me->SetReactState(REACT_AGGRESSIVE); } else { uiTransformationTimer -= diff; if (bStartOfTransformation) { bStartOfTransformation = false; me->AddUnitState(UNIT_STAT_STUNNED|UNIT_STAT_ROOT); me->SetReactState(REACT_PASSIVE); } } } else { if (uiStampedeTimer <= diff) { DoCast(me, SPELL_STAMPEDE); DoScriptText(RAND(SAY_SUMMON_RHINO_1, SAY_SUMMON_RHINO_2, SAY_SUMMON_RHINO_3), me); uiStampedeTimer = 15*IN_MILLISECONDS; } else uiStampedeTimer -= diff; if (uiWhirlingSlashTimer <= diff) { DoCast(me->getVictim(), SPELL_WHIRLING_SLASH); uiWhirlingSlashTimer = 21*IN_MILLISECONDS; ++uiPhaseCounter; } else uiWhirlingSlashTimer -= diff; } break; case RHINO: if (uiPhaseCounter == 2) { if (uiTransformationTimer <= diff) { me->SetDisplayId(DISPLAY_TROLL); Phase = TROLL; uiPhaseCounter = 0; DoScriptText(SAY_TRANSFORM_2, me); uiTransformationTimer = 9*IN_MILLISECONDS; bStartOfTransformation = true; me->ClearUnitState(UNIT_STAT_STUNNED|UNIT_STAT_ROOT); me->SetReactState(REACT_AGGRESSIVE); } else { uiTransformationTimer -= diff; if (bStartOfTransformation) { bStartOfTransformation = false; me->AddUnitState(UNIT_STAT_STUNNED|UNIT_STAT_ROOT); me->SetReactState(REACT_PASSIVE); } } } else { if (uiPunctureTimer <= diff) { DoCast(me->getVictim(), SPELL_PUNCTURE); uiPunctureTimer = 8*IN_MILLISECONDS; } else uiPunctureTimer -= diff; if (uiEnrageTimer <= diff) { DoCast(me->getVictim(), SPELL_ENRAGE); uiEnrageTimer = 20*IN_MILLISECONDS; } else uiEnrageTimer -= diff; if (uiStompTimer <= diff) { DoCast(me->getVictim(), SPELL_STOMP); uiStompTimer = 20*IN_MILLISECONDS; } else uiStompTimer -= diff; if (uiImpalingChargeTimer <= diff) { if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) { DoCast(pTarget, SPELL_IMPALING_CHARGE); lImpaledPlayers.insert(pTarget->GetGUID()); } uiImpalingChargeTimer = 31*IN_MILLISECONDS; ++uiPhaseCounter; } else uiImpalingChargeTimer -= diff; } break; } DoMeleeAttackIfReady(); }
void KilledUnit(Unit* /*victim*/) { DoScriptText(RAND(SAY_SLAY1,SAY_SLAY2), me); }
// *** HANDLED FUNCTION *** //Update AI is called Every single map update (roughly once every 50ms if a player is within the grid) void UpdateAI(const uint32 uiDiff) { //Out of combat timers if (!me->getVictim()) { //Random Say timer if (m_uiSayTimer <= uiDiff) { //Random switch between 5 outcomes DoScriptText(RAND(SAY_RANDOM_0, SAY_RANDOM_1, SAY_RANDOM_2, SAY_RANDOM_3, SAY_RANDOM_4), me); m_uiSayTimer = 45000; //Say something agian in 45 seconds } else m_uiSayTimer -= uiDiff; //Rebuff timer if (m_uiRebuffTimer <= uiDiff) { DoCast(me, SPELL_BUFF); m_uiRebuffTimer = 900000; //Rebuff agian in 15 minutes } else m_uiRebuffTimer -= uiDiff; } //Return since we have no target if (!UpdateVictim()) return; //Spell 1 timer if (m_uiSpell1Timer <= uiDiff) { //Cast spell one on our current target. if (rand()%50 > 10) DoCast(me->getVictim(), SPELL_ONE_ALT); else if (me->IsWithinDist(me->getVictim(), 25.0f)) DoCast(me->getVictim(), SPELL_ONE); m_uiSpell1Timer = 5000; } else m_uiSpell1Timer -= uiDiff; //Spell 2 timer if (m_uiSpell2Timer <= uiDiff) { //Cast spell two on our current target. DoCast(me->getVictim(), SPELL_TWO); m_uiSpell2Timer = 37000; } else m_uiSpell2Timer -= uiDiff; //Beserk timer if (m_uiPhase > 1) { //Spell 3 timer if (m_uiSpell3Timer <= uiDiff) { //Cast spell one on our current target. DoCast(me->getVictim(), SPELL_THREE); m_uiSpell3Timer = 19000; } else m_uiSpell3Timer -= uiDiff; if (m_uiBeserkTimer <= uiDiff) { //Say our line then cast uber death spell DoScriptText(SAY_BERSERK, me, me->getVictim()); DoCast(me->getVictim(), SPELL_BERSERK); //Cast our beserk spell agian in 12 seconds if we didn't kill everyone m_uiBeserkTimer = 12000; } else m_uiBeserkTimer -= uiDiff; } else if (m_uiPhase == 1) //Phase timer { if (m_uiPhaseTimer <= uiDiff) { //Go to next phase ++m_uiPhase; DoScriptText(SAY_PHASE, me); DoCast(me, SPELL_FRENZY); } else m_uiPhaseTimer -= uiDiff; } DoMeleeAttackIfReady(); }
void EnterCombat(Unit* /*who*/) { DoScriptText(RAND(SAY_AGGRO_1, SAY_AGGRO_2), me); _EnterCombat(); }
void KilledUnit(Unit* victim) { if (victim->GetTypeId() == TYPEID_PLAYER) Talk(RAND(SAY_PLAYER_KILL_01, SAY_PLAYER_KILL_02)); }
void UpdateAI(uint32 diff) override { //Check if we have a target if (!UpdateVictim()) return; uint32 currentPhase = instance->GetData(DATA_CTHUN_PHASE); if (currentPhase == PHASE_EYE_GREEN_BEAM || currentPhase == PHASE_EYE_RED_BEAM) { // EyeTentacleTimer if (EyeTentacleTimer <= diff) { //Spawn the 8 Eye Tentacles in the corret spots SpawnEyeTentacle(0, 20); //south SpawnEyeTentacle(10, 10); //south west SpawnEyeTentacle(20, 0); //west SpawnEyeTentacle(10, -10); //north west SpawnEyeTentacle(0, -20); //north SpawnEyeTentacle(-10, -10); //north east SpawnEyeTentacle(-20, 0); // east SpawnEyeTentacle(-10, 10); // south east EyeTentacleTimer = 45000; } else EyeTentacleTimer -= diff; } switch (currentPhase) { case PHASE_EYE_GREEN_BEAM: //BeamTimer if (BeamTimer <= diff) { //SPELL_GREEN_BEAM if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) { me->InterruptNonMeleeSpells(false); DoCast(target, SPELL_GREEN_BEAM); //Correctly update our target me->SetTarget(target->GetGUID()); } //Beam every 3 seconds BeamTimer = 3000; } else BeamTimer -= diff; //ClawTentacleTimer if (ClawTentacleTimer <= diff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) { Creature* Spawned = NULL; //Spawn claw tentacle on the random target Spawned = me->SummonCreature(NPC_CLAW_TENTACLE, *target, TEMPSUMMON_CORPSE_DESPAWN, 500); if (Spawned && Spawned->AI()) Spawned->AI()->AttackStart(target); } //One claw tentacle every 12.5 seconds ClawTentacleTimer = 12500; } else ClawTentacleTimer -= diff; //PhaseTimer if (PhaseTimer <= diff) { //Switch to Dark Beam instance->SetData(DATA_CTHUN_PHASE, PHASE_EYE_RED_BEAM); me->InterruptNonMeleeSpells(false); me->SetReactState(REACT_PASSIVE); //Remove any target me->SetTarget(ObjectGuid::Empty); //Select random target for dark beam to start on if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) { //Face our target DarkGlareAngle = me->GetAngle(target); DarkGlareTickTimer = 1000; DarkGlareTick = 0; ClockWise = RAND(true, false); } //Add red coloration to C'thun DoCast(me, SPELL_RED_COLORATION, true); //Freeze animation DoCast(me, SPELL_FREEZE_ANIM); me->SetOrientation(DarkGlareAngle); me->StopMoving(); //Darkbeam for 35 seconds PhaseTimer = 35000; } else PhaseTimer -= diff; break; case PHASE_EYE_RED_BEAM: if (DarkGlareTick < 35) { if (DarkGlareTickTimer <= diff) { //Set angle and cast if (ClockWise) me->SetOrientation(DarkGlareAngle + DarkGlareTick * float(M_PI) / 35); else me->SetOrientation(DarkGlareAngle - DarkGlareTick * float(M_PI) / 35); me->StopMoving(); //Actual dark glare cast, maybe something missing here? DoCast(me, SPELL_DARK_GLARE, false); //Increase tick ++DarkGlareTick; //1 second per tick DarkGlareTickTimer = 1000; } else DarkGlareTickTimer -= diff; } //PhaseTimer if (PhaseTimer <= diff) { //Switch to Eye Beam instance->SetData(DATA_CTHUN_PHASE, PHASE_EYE_GREEN_BEAM); BeamTimer = 3000; ClawTentacleTimer = 12500; //4 per Eye beam phase (unsure if they spawn during Dark beam) me->InterruptNonMeleeSpells(false); //Remove Red coloration from c'thun me->RemoveAurasDueToSpell(SPELL_RED_COLORATION); me->RemoveAurasDueToSpell(SPELL_FREEZE_ANIM); //set it back to aggressive me->SetReactState(REACT_AGGRESSIVE); //Eye Beam for 50 seconds PhaseTimer = 50000; } else PhaseTimer -= diff; break; //Transition phase case PHASE_CTHUN_TRANSITION: //Remove any target me->SetTarget(ObjectGuid::Empty); me->SetHealth(0); me->SetVisible(false); break; //Dead phase case PHASE_CTHUN_DONE: Creature* pPortal= me->FindNearestCreature(NPC_CTHUN_PORTAL, 10); if (pPortal) pPortal->DespawnOrUnsummon(); me->DespawnOrUnsummon(); break; } }
void KilledUnit(Unit* /*Killed*/) { DoScriptText(RAND(SAY_KILL_1, SAY_KILL_2), me); }
void KilledUnit(Unit* pVictim) { DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2,SAY_SLAY_3), m_creature); }
void KilledUnit(Unit* /*victim*/) { DoScriptText(RAND(YELL_KILL1, YELL_KILL2, YELL_KILL3), me); }
void UpdateAI(const uint32 diff) { if (!me->isInCombat()) return; if (!me->getVictim() && me->getThreatManager().isThreatListEmpty()) { EnterEvadeMode(); return; } events.Update(diff); if (me->HasUnitState(UNIT_STAT_CASTING)) return; switch(events.ExecuteEvent()) { case EVENT_PURSUE: if (Creature* pKrick = GetKrick()) DoScriptText(RAND(SAY_KRICK_CHASE_1, SAY_KRICK_CHASE_2, SAY_KRICK_CHASE_3), pKrick); if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) { me->Attack(pTarget, false); DoScriptText(SAY_ICK_CHASE_1, me, pTarget); DoCast(pTarget, SPELL_PURSUED); } DoCast(SPELL_CONFUSION); events.ScheduleEvent(EVENT_PURSUE, 30000, GCD_1); return; case EVENT_MIGHTY_KICK: DoCast(me->getVictim(), SPELL_MIGHTY_KICK); events.ScheduleEvent(EVENT_MIGHTY_KICK, 25000, GCD_1); return; case EVENT_POISON_NOVA: if (Creature* pKrick = GetKrick()) DoScriptText(SAY_KRICK_POISON_NOVA, pKrick); DoScriptText(SAY_ICK_POISON_NOVA, me); DoCastAOE(SPELL_POISON_NOVA); events.ScheduleEvent(EVENT_POISON_NOVA, 30000, GCD_1); return; case EVENT_TOXIC_WASTE: DoCast(me->getVictim(), SPELL_TOXIC_WASTE); events.ScheduleEvent(EVENT_TOXIC_WASTE, 5000); return; case EVENT_SHADOW_BOLT: DoCast(me->getVictim(), SPELL_SHADOW_BOLT); events.ScheduleEvent(EVENT_SHADOW_BOLT, 15000); return; case EVENT_EXPLOSIVE_BARRAGE: if (Creature *pKrick = GetKrick()) { DoScriptText(SAY_KRICK_BARRAGE_1, pKrick); DoScriptText(SAY_KRICK_BARRAGE_2, pKrick); } DoCastAOE(SPELL_EXPLOSIVE_BARRAGE); me->GetMotionMaster()->MoveIdle(); events.DelayEvents(20000, GCD_1); // 2 sec cast + 18 sec events.ScheduleEvent(EVENT_END_EXPLOSIVE_BARRAGE, 20000); return; case EVENT_END_EXPLOSIVE_BARRAGE: me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MoveChase(me->getVictim()); events.ScheduleEvent(EVENT_EXPLOSIVE_BARRAGE, 25000); break; } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (Phase == NORMAL) { //Return since we have no target if (!UpdateVictim()) return; if (uiSinsterStrikeTimer <= diff) { DoCast(m_creature->getVictim(), DUNGEON_MODE(SPELL_SINSTER_STRIKE, H_SPELL_SINSTER_STRIKE)); uiSinsterStrikeTimer = urand(5000,9000); } else uiSinsterStrikeTimer -= diff; if (uiCallFlamesTimer <= diff) { if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) { DoCast(pTarget, SPELL_CALL_FLAMES); uiCallFlamesTimer = urand(8000,12000); } } else uiCallFlamesTimer -= diff; if (!bSacrificed) if (uiRitualOfSwordTimer <= diff) { pSacrificeTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); if (pSacrificeTarget) { DoScriptText(RAND(SAY_SACRIFICE_PLAYER_1,SAY_SACRIFICE_PLAYER_2,SAY_SACRIFICE_PLAYER_3,SAY_SACRIFICE_PLAYER_4,SAY_SACRIFICE_PLAYER_5),m_creature); DoCast(pSacrificeTarget, SPELL_RITUAL_OF_THE_SWORD); //Spell doesn't teleport DoTeleportPlayer(pSacrificeTarget, 296.632, -346.075, 90.63, 4.6); m_creature->SetUnitMovementFlags(MOVEMENTFLAG_FLY_MODE); DoTeleportTo(296.632, -346.075, 120.85); Phase = SACRIFICING; for (uint8 i = 0; i < 3; ++i) if (Creature* pRitualChanneler = m_creature->SummonCreature(CREATURE_RITUAL_CHANNELER, RitualChannelerPos[i], TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 360000)) if (pRitualChanneler->AI()) pRitualChanneler->AI()->SetGUID(pSacrificeTarget->GetGUID()); bSacrificed = true; } } else uiRitualOfSwordTimer -= diff; DoMeleeAttackIfReady(); } else //SACRIFICING { if (uiSacrificeTimer <= diff) { if (!summons.empty() && pSacrificeTarget && pSacrificeTarget->isAlive()) m_creature->Kill(pSacrificeTarget, false); // durability damage? //go down Phase = NORMAL; pSacrificeTarget = NULL; m_creature->SetUnitMovementFlags(MOVEMENTFLAG_WALK_MODE); if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) m_creature->GetMotionMaster()->MoveChase(pTarget); uiSacrificeTimer = 8000; } else uiSacrificeTimer -= diff; } }
void KilledUnit(Unit* who) { if (who && who->GetEntry() != ENTRY_VAZRUDEN) DoScriptText(RAND(SAY_KILL_1, SAY_KILL_2), me); }
void UpdateAI(const uint32 diff) { switch (Phase) { case FLYING: if (!UpdateVictim()) return; if (me->GetPositionX() >= 519) { me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); if (!m_bSaidEmote) { DoScriptText(EMOTE_RANGE, me); m_bSaidEmote = true; } } else { me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); m_bSaidEmote = false; } if (m_uiMountTimer && m_uiMountTimer <= diff) { me->Mount(DATA_MOUNT); me->SetCanFly(true); m_uiMountTimer = 0; } else m_uiMountTimer -= diff; if (m_uiSummonTimer <= diff) { SpawnMobs(); m_uiSummonTimer = 25000; } else m_uiSummonTimer -= diff; if (m_uiMovementTimer <= diff) { switch (m_uiWaypointId) { case 0: me->GetMotionMaster()->MovePoint(0, Location[1].GetPositionX(), Location[1].GetPositionY(), Location[1].GetPositionZ()); m_uiMovementTimer = 5000; break; case 1: me->GetMotionMaster()->MovePoint(0, Location[2].GetPositionX(), Location[2].GetPositionY(), Location[2].GetPositionZ()); m_uiMovementTimer = 2000; break; case 2: me->GetMotionMaster()->MovePoint(0, Location[3].GetPositionX(), Location[3].GetPositionY(), Location[3].GetPositionZ()); m_uiMovementTimer = 15000; break; case 3: me->GetMotionMaster()->MovePoint(0, Location[69].GetPositionX(), Location[69].GetPositionY(), Location[69].GetPositionZ()); DoScriptText(RAND(SAY_DRAKE_BREATH_1, SAY_DRAKE_BREATH_2), me); DoScriptText(EMOTE_BREATH, me); m_uiMovementTimer = 2500; break; case 4: me->GetMotionMaster()->MovePoint(0, Location[70].GetPositionX(), Location[70].GetPositionY(), Location[70].GetPositionZ()); m_uiMovementTimer = 2000; SpawnTrigger(); break; case 5: me->GetMotionMaster()->MovePoint(0, Location[71].GetPositionX(), Location[71].GetPositionY(), Location[71].GetPositionZ()); m_uiMovementTimer = 3000; break; case 6: me->GetMotionMaster()->MovePoint(0, Location[3].GetPositionX(), Location[3].GetPositionY(), Location[3].GetPositionZ()); m_uiWaypointId = 2; m_uiMovementTimer = 15000; break; } m_uiWaypointId++; } else m_uiMovementTimer -= diff; break; case SKADI: //Return since we have no target if (!UpdateVictim()) return; if (m_uiCrushTimer <= diff) { DoCastVictim(SPELL_CRUSH); m_uiCrushTimer = 8000; } else m_uiCrushTimer -= diff; if (m_uiPoisonedSpearTimer <= diff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) DoCast(target, SPELL_POISONED_SPEAR); m_uiPoisonedSpearTimer = 10000; } else m_uiPoisonedSpearTimer -= diff; if (m_uiWhirlwindTimer <= diff) { DoCastAOE(SPELL_WHIRLWIND); m_uiWhirlwindTimer = 20000; } else m_uiWhirlwindTimer -= diff; DoMeleeAttackIfReady(); break; } }
void EnterCombat(Unit* who) { DoScriptText(RAND(SAY_AGGRO_1, SAY_AGGRO_2), me, who); }
void KilledUnit(Unit *victim) { DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), me); }
void UpdateAI(const uint32 diff) { if (IsIntro) { if (IntroPhaseTimer <= diff) DoIntro(); else IntroPhaseTimer -= diff; if (IntroPhase == 3 + 1) { if (IntroFrostBoltTimer <= diff) { if (Creature* Madrigosa = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_MADRIGOSA) : 0)) { Madrigosa->CastSpell(me, SPELL_INTRO_FROSTBOLT, true); IntroFrostBoltTimer = 2000; } } else IntroFrostBoltTimer -= diff; } if (!UpdateVictim()) return; DoMeleeAttackIfReady(); } if (!UpdateVictim() || IsIntro) return; if (SlashTimer <= diff) { DoCast(me->getVictim(), SPELL_METEOR_SLASH); SlashTimer = 11000; } else SlashTimer -= diff; if (StompTimer <= diff) { DoScriptText(RAND(YELL_LOVE1, YELL_LOVE2, YELL_LOVE3), me); DoCast(me->getVictim(), SPELL_STOMP); StompTimer = 30000; } else StompTimer -= diff; if (BurnTimer <= diff) { std::list<Unit*> targets; SelectTargetList(targets, 10, SELECT_TARGET_RANDOM, 100, true); for (std::list<Unit*>::const_iterator i = targets.begin(); i != targets.end(); ++i) if (!(*i)->HasAura(SPELL_BURN)) { (*i)->CastSpell((*i), SPELL_BURN, true); break; } BurnTimer = urand(60000, 180000); } else BurnTimer -= diff; if (BerserkTimer < diff && !Enraged) { DoScriptText(YELL_BERSERK, me); DoCast(me, SPELL_BERSERK); Enraged = true; } else BerserkTimer -= diff; DoMeleeAttackIfReady(); }
void KilledUnit(Unit*) { DoScriptText(RAND(SAY_TH_RANDOM_KILL1,SAY_TH_RANDOM_KILL2,SAY_TH_RANDOM_KILL3), me); }
void EnterCombat(Unit* /*who*/) { //For an small probability the npc says something when he get aggro if (urand(0, 9) > 7) DoScriptText(RAND(SAY_OOX_AGGRO1, SAY_OOX_AGGRO2), me); }
void EnterCombat(Unit* /*who*/) { DoScriptText(RAND(SAY_OOX_AGGRO1, SAY_OOX_AGGRO2), me); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; //Shimmer_Timer Timer if (Shimmer_Timer <= diff) { //Remove old vulnerabilty spell if (CurrentVurln_Spell) me->RemoveAurasDueToSpell(CurrentVurln_Spell); //Cast new random vulnerabilty on self uint32 spell = RAND(SPELL_FIRE_VULNERABILITY, SPELL_FROST_VULNERABILITY, SPELL_SHADOW_VULNERABILITY, SPELL_NATURE_VULNERABILITY, SPELL_ARCANE_VULNERABILITY); DoCast(me, spell); CurrentVurln_Spell = spell; DoScriptText(EMOTE_SHIMMER, me); Shimmer_Timer = 45000; } else Shimmer_Timer -= diff; //Breath1_Timer if (Breath1_Timer <= diff) { DoCast(me->getVictim(), Breath1_Spell); Breath1_Timer = 60000; } else Breath1_Timer -= diff; //Breath2_Timer if (Breath2_Timer <= diff) { DoCast(me->getVictim(), Breath2_Spell); Breath2_Timer = 60000; } else Breath2_Timer -= diff; //Affliction_Timer if (Affliction_Timer <= diff) { std::list<HostileReference*> threatlist = me->getThreatManager().getThreatList(); for (std::list<HostileReference*>::const_iterator i = threatlist.begin(); i != threatlist.end(); ++i) { Unit* pUnit; if ((*i) && (*i)->getSource()) { pUnit = Unit::GetUnit((*me), (*i)->getUnitGuid()); if (pUnit) { //Cast affliction DoCast(pUnit, RAND(SPELL_BROODAF_BLUE, SPELL_BROODAF_BLACK, SPELL_BROODAF_RED, SPELL_BROODAF_BRONZE, SPELL_BROODAF_GREEN), true); //Chromatic mutation if target is effected by all afflictions if (pUnit->HasAura(SPELL_BROODAF_BLUE, 0) && pUnit->HasAura(SPELL_BROODAF_BLACK, 0) && pUnit->HasAura(SPELL_BROODAF_RED, 0) && pUnit->HasAura(SPELL_BROODAF_BRONZE, 0) && pUnit->HasAura(SPELL_BROODAF_GREEN, 0)) { //pTarget->RemoveAllAuras(); //DoCast(pTarget, SPELL_CHROMATIC_MUT_1); //Chromatic mutation is causing issues //Assuming it is caused by a lack of core support for Charm //So instead we instant kill our target //WORKAROUND if (pUnit->GetTypeId() == TYPEID_PLAYER) pUnit->CastSpell(pUnit, 5, false); } } } } Affliction_Timer = 10000; } else Affliction_Timer -= diff; //Frenzy_Timer if (Frenzy_Timer <= diff) { DoCast(me, SPELL_FRENZY); DoScriptText(EMOTE_FRENZY, me); Frenzy_Timer = urand(10000,15000); } else Frenzy_Timer -= diff; //Enrage if not already enraged and below 20% if (!Enraged && (me->GetHealth()*100 / me->GetMaxHealth()) < 20) { DoCast(me, SPELL_ENRAGE); Enraged = true; } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!Intro) { if (!instance) return; if (Intro_Timer <= diff) { switch (Intro_Phase) { case 1: DoScriptText(SAY_INTRO, me); instance->HandleGameObject(instance->GetData64(DATA_SPHERE_SHIELD), true); ++Intro_Phase; Intro_Timer = 25000; break; case 2: DoScriptText(SAY_AGGRO, me); if (Unit* mellic = Unit::GetUnit(*me, instance->GetData64(DATA_MELLICHAR))) { //should have a better way to do this. possibly spell exist. mellic->setDeathState(JUST_DIED); mellic->SetHealth(0); instance->SetData(TYPE_SHIELD_OPEN, IN_PROGRESS); } ++Intro_Phase; Intro_Timer = 3000; break; case 3: me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); Intro = true; break; } } else Intro_Timer -=diff; } if (!UpdateVictim()) return; if (!IsImage66 && !HealthAbovePct(66)) { DoSplit(66); IsImage66 = true; } if (!IsImage33 && !HealthAbovePct(33)) { DoSplit(33); IsImage33 = true; } if (MindRend_Timer <= diff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1)) DoCast(target, SPELL_MIND_REND); else DoCast(me->getVictim(), SPELL_MIND_REND); MindRend_Timer = 8000; } else MindRend_Timer -=diff; if (Fear_Timer <= diff) { if (me->IsNonMeleeSpellCasted(false)) return; DoScriptText(RAND(SAY_FEAR_1, SAY_FEAR_2), me); if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1)) DoCast(target, SPELL_FEAR); else DoCast(me->getVictim(), SPELL_FEAR); Fear_Timer = 25000; } else Fear_Timer -=diff; if (Domination_Timer <= diff) { if (me->IsNonMeleeSpellCasted(false)) return; DoScriptText(RAND(SAY_MIND_1, SAY_MIND_2), me); if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1)) DoCast(target, SPELL_DOMINATION); else DoCast(me->getVictim(), SPELL_DOMINATION); Domination_Timer = 16000+rand()%16000; } else Domination_Timer -=diff; if (IsHeroic()) { if (ManaBurn_Timer <= diff) { if (me->IsNonMeleeSpellCasted(false)) return; if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1)) DoCast(target, H_SPELL_MANA_BURN); ManaBurn_Timer = 16000+rand()%16000; } else ManaBurn_Timer -=diff; } DoMeleeAttackIfReady(); }
void makeTestQuery(QUERY_TYPE qt, char *query) { switch(qt) { case Q_POINT_SELECTION: { int a=RAND(TEST_MAX); //cout<<"point: "<<a<<endl; sprintf(query, "PRO;R;$;R.a00,;$;:SEL;R;$;R.a00,;=,R.a00,$,$,%d,$,$,;:$:$:$:", a); }break; case Q_RANGE_SELECTION: { int a=RAND(TEST_MAX); int b=RAND(TEST_MAX); int minmin=min(a,b); int maxmax=minmin+20000000;//max(a,b); //result: 155943, 10000000 //result: 311916, 20000000 //cout<<"range: ["<<minmin<<", "<<maxmax<<"]"<<endl; sprintf(query, "PRO;R;$;R.a00,;$;:SEL;R;$;R.a00,;AND,>,R.a00,$,$,%d,$,$,<,R.a00,$,$,%d,$,$,;:$:$:$:", minmin, maxmax); }break; case Q_AGG: { sprintf(query, "AGG;R;MAX;R.a00,;$;:$:$:"); }break; case Q_ORDERBY: { sprintf(query, "AGG;R;MAX;R.a00,;$;:ORD;R;$;R.a00,;$;:$:$:$:"); //sprintf(query, "PRO;$;$;R.b00,;$;:ORD;R;$;R.a00,;$;:$:$:$:"); //sprintf(query, "PRO;R;$;R.b00,;$;:ORD;R;$;R.a00,;$;:SEL;R;$;R.b00,;<,R.b00,$,$,8,$,$,;:$:$:$:$:"); }break; case Q_AGG_GROUPBY: { sprintf(query, "AGG;R;MAX;R.a00,;$;:GRP;R;$;R.b00,;$;:$:$:$:"); }break; case Q_NINLJ: { //sprintf(query, "JOIN;R;S;R.a00,S.a00,;<,R.a00,$,$,S.a00,$,$,;:$:$:"); /*int a1=RAND(TEST_MAX); int a2=RAND(TEST_MAX); int minmin1=a1; int maxmax1=minmin1+20000000;//max(a,b); int minmin2=a2; int maxmax2=minmin2+20000000;//max(a,b); sprintf(query, "PRO;R;$;R.a00,;$;:JOIN;R;S;R.a00,S.a00,;<,R.a00,$,$,S.a00,$,$,;:SEL;R;$;R.a00,;AND,>,R.a00,$,$,%d,$,$,<,R.a00,$,$,%d,$,$,;:$:$:SEL;S;$;S.a00,;AND,>,S.a00,$,$,%d,$,$,<,S.a00,$,$,%d,$,$,;:$:$:$:",minmin1,maxmax1,minmin2,maxmax2);*/ //cout<<"I have changed the NLJ for testing"<<endl; int a1=RAND(TEST_MAX); int a2=RAND(TEST_MAX); int delta=(int)(20*1000000.0); int minmin1=a1; int maxmax1=minmin1+delta;//max(a,b); int minmin2=a2; int maxmax2=minmin2+delta;//max(a,b); sprintf(query, "PRO;R;$;R.a00,;$;:JOIN;R;S;R.a00,S.a00,;<,R.a00,$,$,S.a00,$,$,;:SEL;R;$;R.a00,;AND,>,R.a00,$,$,%d,$,$,<,R.a00,$,$,%d,$,$,;:$:$:SEL;S;$;S.a00,;AND,>,S.a00,$,$,%d,$,$,<,S.a00,$,$,%d,$,$,;:$:$:$:",minmin1,maxmax1,minmin2,maxmax2); }break; case Q_INLJ: { sprintf(query,"PRO;R;$;R.a00,;$;:JOIN;R;S;R.a00,S.a00,;=,R.a00,$,$,S.a00,$,$,;:$:$:$:");//my own invension. = -> INLJ }break; case Q_SMJ: { sprintf(query,"PRO;R;$;R.a00,;$;:JOIN;R;S;R.a00,S.a00,;+,R.a00,$,$,S.a00,$,$,;:$:$:$:");//my own invension. + -> SMJ }break; case Q_HJ: { sprintf(query,"PRO;R;$;R.a00,;$;:JOIN;R;S;R.a00,S.a00,;-,R.a00,$,$,S.a00,$,$,;:$:$:$:");//my own invension. - -> HJ }break; case Q_DBMBENCH1: { int a=RAND(20000); int b=(a-2000); if(b<0) b=a+2000; int minmin=min(a,b); int maxmax=max(a,b); sprintf(query,"PRO;$;$;T1.a3,;$;:SEL;$;T1;T1.a2,;AND,<,%d,$,$,T1.a2,$,$,<,T1.a2,$,$,%d,$,$,;:$:$:$:",minmin,maxmax); }break; case Q_DBMBENCH2: { int a=RAND(20000); int b=(a-4000); if(b<0) b=a+4000; int minmin=min(a,b); int maxmax=max(a,b); sprintf(query,"AGG;T1;AVG;T1.a3,;$;:JOIN;T1;T2;T1.a1,T2.a1,;=,T1.a1,$,$,T2.a1,$,$,;:SEL;$;T1;T1.a2,;AND,<,%d,$,$,T1.a2,$,$,<,T1.a2,$,$,%d,$,$,;:$:$:$:$:",minmin,maxmax); //sprintf(query,"PRO;T1;$;T1.a3,;$;:JOIN;T1;T2;T1.a1,T2.a1,;=,T1.a1,$,$,T2.a1,$,$,;:$:$:$:"); }break; case Q_DBMBENCH3: { int a=RAND(20000); int b=(a-100); if(b<0) b=a+100; int minmin=min(a,b); int maxmax=max(a,b); sprintf(query,"AGG;T1;AVG;T1.a3,;$;:SEL;$;T1;T1.a2,;AND,<,%d,$,$,T1.a2,$,$,<,T1.a2,$,$,%d,$,$,;:$:$:$:",minmin,maxmax); }break; } __DEBUG__(query); }
void UpdateAI(const uint32 uiDiff) { //Return since we have no target if (!UpdateVictim()) return; //exploit fix, remove later if (m_uiCheckZ <= uiDiff) { if (me->GetPositionZ() < 50.0f) { EnterEvadeMode(); return; } m_uiCheckZ = 1000; } else m_uiCheckZ -= uiDiff; if (m_bIsStriking && !m_bMove) { if (m_uiPause_Timer <= uiDiff) { if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() != TARGETED_MOTION_TYPE) { if (me->getVictim()) me->GetMotionMaster()->MoveChase(me->getVictim()); } m_bHasTemper = false; m_bIsStriking = false; m_uiPause_Timer = 1500; } else m_uiPause_Timer -= uiDiff; return; } // ShatteringStomp all the Time, if (!m_bHasTemper && !m_bMove) { if (m_uiShatteringStomp_Timer <= uiDiff) { DoScriptText(RAND(SAY_STOMP_1,SAY_STOMP_2), me); DoCast(me, DUNGEON_MODE(SPELL_SHATTERING_STOMP_N,SPELL_SHATTERING_STOMP_H)); if (Creature* temp = me->FindNearestCreature(NPC_BRITTLE_GOLEM,99)) { DoScriptText(EMOTE_SHATTER, me); m_bCanShatterGolem = true; } m_uiShatteringStomp_Timer = 30000; } else m_uiShatteringStomp_Timer -= uiDiff; } // Shatter Golems 3 seconds after Shattering Stomp if (m_bCanShatterGolem) { if (m_uiShatter_Timer <= uiDiff) { ShatterGolem(); m_uiShatter_Timer = 3000; m_bCanShatterGolem = false; } else m_uiShatter_Timer -= uiDiff; } Creature* pAnvil = m_pInstance->instance->GetCreature(m_pInstance->GetData64(DATA_VOLKHAN_ANVIL)); float fX, fY, fZ; me->GetContactPoint(pAnvil, fX, fY, fZ, INTERACTION_DISTANCE); // Health check if (!m_bCanShatterGolem && me->HealthBelowPct(100 - 20 * m_uiHealthAmountModifier) && !m_bMove) { ++m_uiHealthAmountModifier; if (me->IsNonMeleeSpellCasted(false)) me->InterruptNonMeleeSpells(false); DoScriptText(RAND(SAY_FORGE_1, SAY_FORGE_2), me); if (me->GetDistance(pAnvil) > 5) { me->GetMotionMaster()->Clear(); me->SetReactState(REACT_PASSIVE); me->GetMotionMaster()->MovePoint(5,fX,fY,fZ); } DoScriptText(EMOTE_TO_ANVIL, me); m_bMove=true; } if (me->IsWithinMeleeRange(pAnvil,5) && m_bMove) { me->GetMotionMaster()->Clear(); me->SetReactState(REACT_AGGRESSIVE); m_bHasTemper = true; m_bMove=false; for (uint8 i = 0; i < MAX_GOLEM; ++i) { DoCast(SPELL_SUMMON_MOLTEN_GOLEM); } DoCast(SPELL_TEMPER); m_bIsStriking = true; } if (me->GetMotionMaster()->GetCurrentMovementGeneratorType()!=POINT_MOTION_TYPE && m_bMove) //if (m_uiCheckTimer<=uiDiff) { me->GetMotionMaster()->MovePoint(5,fX,fY,fZ); m_uiCheckTimer=1100; } //else //m_uiCheckTimer-=uiDiff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; if (HealthBelowPct(10) && !Enraged) { Enraged = true; DoCast(me, SPELL_ENRAGE, true); DoScriptText(SAY_ENRAGE, me); } //Randomly cast one beam. if (BeamTimer <= diff) { Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0); if (!pTarget || !pTarget->isAlive()) return; BeamTimer = 9000; switch(CurrentBeam) { case 0: DoCast(pTarget, SPELL_BEAM_SINISTER); break; case 1: DoCast(pTarget, SPELL_BEAM_VILE); break; case 2: DoCast(pTarget, SPELL_BEAM_WICKED); break; case 3: DoCast(pTarget, SPELL_BEAM_SINFUL); break; } ++BeamCount; uint32 Beam = CurrentBeam; if (BeamCount > 3) while (CurrentBeam == Beam) CurrentBeam = rand()%3; } else BeamTimer -= diff; // Random Prismatic Shield every 15 seconds. if (PrismaticShieldTimer <= diff) { uint32 random = rand()%6; if (PrismaticAuras[random]) DoCast(me, PrismaticAuras[random]); PrismaticShieldTimer = 15000; } else PrismaticShieldTimer -= diff; // Select 3 random targets (can select same target more than once), teleport to a random location then make them cast explosions until they get away from each other. if (FatalAttractionTimer <= diff) { ExplosionCount = 0; TeleportPlayers(); DoScriptText(RAND(SAY_SPELL2,SAY_SPELL3), me); FatalAttractionExplodeTimer = 2000; FatalAttractionTimer = 40000 + rand()%31 * 1000; } else FatalAttractionTimer -= diff; if (FatalAttractionExplodeTimer <= diff) { // Just make them explode three times... they're supposed to keep exploding while they are in range, but it'll take too much code. I'll try to think of an efficient way for it later. if (ExplosionCount < 3) { for (uint8 i = 0; i < 3; ++i) { Unit* pUnit = NULL; if (TargetGUID[i]) { pUnit = Unit::GetUnit((*me), TargetGUID[i]); if (pUnit) pUnit->CastSpell(pUnit, SPELL_ATTRACTION, true); TargetGUID[i] = 0; } } ++ExplosionCount; FatalAttractionExplodeTimer = 1000; } else { FatalAttractionExplodeTimer = FatalAttractionTimer + 2000; ExplosionCount = 0; } } else FatalAttractionExplodeTimer -= diff; if (ShriekTimer <= diff) { DoCast(me->getVictim(), SPELL_SILENCING_SHRIEK); ShriekTimer = 25000+rand()%10 * 1000; } else ShriekTimer -= diff; if (SaberTimer <= diff) { DoCast(me->getVictim(), SPELL_SABER_LASH); SaberTimer = 25000+rand()%10 * 1000; } else SaberTimer -= diff; //Enrage if (!me->HasAura(SPELL_BERSERK)) { if (EnrageTimer <= diff) { DoCast(me, SPELL_BERSERK); DoScriptText(SAY_ENRAGE, me); } else EnrageTimer -= diff; } //Random taunts if (RandomYellTimer <= diff) { DoScriptText(RAND(SAY_TAUNT1,SAY_TAUNT2,SAY_TAUNT3), me); RandomYellTimer = 60000 + rand()%91 * 1000; } else RandomYellTimer -= diff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; if (uiPhaseTimer <= diff) { switch (Phase) { case CASTING_FLAME_SPHERES: { Creature* pSpheres[3]; //DoCast(me, SPELL_FLAME_SPHERE_SUMMON_1); pSpheres[0] = DoSpawnCreature(CREATURE_FLAME_SPHERE, 0, 0, 5, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10*IN_MILLISECONDS); Unit *pSphereTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); if (pSphereTarget && pSpheres[0]) { float angle,x,y; angle = pSpheres[0]->GetAngle(pSphereTarget); x = pSpheres[0]->GetPositionX() + DATA_SPHERE_DISTANCE * cos(angle); y = pSpheres[0]->GetPositionY() + DATA_SPHERE_DISTANCE * sin(angle); pSpheres[0]->GetMotionMaster()->MovePoint(0, x, y, pSpheres[0]->GetPositionZ()); } if (IsHeroic()) { //DoCast(me, H_SPELL_FLAME_SPHERE_SUMMON_1); pSpheres[1] = DoSpawnCreature(H_CREATURE_FLAME_SPHERE_1, 0, 0, 5, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10*IN_MILLISECONDS); //DoCast(me, H_SPELL_FLAME_SPHERE_SUMMON_2); pSpheres[2] = DoSpawnCreature(H_CREATURE_FLAME_SPHERE_2, 0, 0, 5, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10*IN_MILLISECONDS); if (pSphereTarget && pSpheres[1] && pSpheres[2]) { float angle,x,y; angle = pSpheres[1]->GetAngle(pSphereTarget) + DATA_SPHERE_ANGLE_OFFSET; x = pSpheres[1]->GetPositionX() + DATA_SPHERE_DISTANCE/2 * cos(angle); y = pSpheres[1]->GetPositionY() + DATA_SPHERE_DISTANCE/2 * sin(angle); pSpheres[1]->GetMotionMaster()->MovePoint(0, x, y, pSpheres[1]->GetPositionZ()); angle = pSpheres[2]->GetAngle(pSphereTarget) - DATA_SPHERE_ANGLE_OFFSET; x = pSpheres[2]->GetPositionX() + DATA_SPHERE_DISTANCE/2 * cos(angle); y = pSpheres[2]->GetPositionY() + DATA_SPHERE_DISTANCE/2 * sin(angle); pSpheres[2]->GetMotionMaster()->MovePoint(0, x, y, pSpheres[2]->GetPositionZ()); } } Phase = NORMAL; uiPhaseTimer = 0; break; } case JUST_VANISHED: if (Unit *pEmbraceTarget = GetEmbraceTarget()) { me->GetMotionMaster()->Clear(); me->SetSpeed(MOVE_WALK, 2.0f, true); me->GetMotionMaster()->MoveChase(pEmbraceTarget); } Phase = VANISHED; uiPhaseTimer = 1300; break; case VANISHED: if (Unit *pEmbraceTarget = GetEmbraceTarget()) DoCast(pEmbraceTarget, SPELL_EMBRACE_OF_THE_VAMPYR); me->GetMotionMaster()->Clear(); me->SetSpeed(MOVE_WALK, 1.0f, true); me->GetMotionMaster()->MoveChase(me->getVictim()); Phase = FEEDING; uiPhaseTimer = 20*IN_MILLISECONDS; break; case FEEDING: Phase = NORMAL; uiPhaseTimer = 0; uiEmbraceTarget = 0; break; case NORMAL: if (uiBloodthirstTimer <= diff) { DoCast(me->getVictim(), SPELL_BLOODTHIRST); uiBloodthirstTimer = 10*IN_MILLISECONDS; } else uiBloodthirstTimer -= diff; if (uiFlamesphereTimer <= diff) { DoCast(me, SPELL_CONJURE_FLAME_SPHERE); Phase = CASTING_FLAME_SPHERES; uiPhaseTimer = 3*IN_MILLISECONDS + diff; uiFlamesphereTimer = 15*IN_MILLISECONDS; } else uiFlamesphereTimer -= diff; if (uiVanishTimer <= diff) { //Count alive players Unit *pTarget = NULL; std::list<HostileReference *> t_list = me->getThreatManager().getThreatList(); std::vector<Unit *> target_list; for (std::list<HostileReference *>::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr) { pTarget = Unit::GetUnit(*me, (*itr)->getUnitGuid()); // exclude pets & totems if (pTarget && pTarget->GetTypeId() == TYPEID_PLAYER && pTarget->isAlive()) target_list.push_back(pTarget); pTarget = NULL; } //He only vanishes if there are 3 or more alive players if (target_list.size() > 2) { DoScriptText(RAND(SAY_VANISH_1,SAY_VANISH_2), me); DoCast(me, SPELL_VANISH); Phase = JUST_VANISHED; uiPhaseTimer = 500; if (Unit* pEmbraceTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) uiEmbraceTarget = pEmbraceTarget->GetGUID(); } uiVanishTimer = urand(25*IN_MILLISECONDS,35*IN_MILLISECONDS); } else uiVanishTimer -= diff; DoMeleeAttackIfReady(); break; } } else uiPhaseTimer -= diff; }
void KilledUnit(Unit * /*victim*/) { DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2,SAY_SLAY_3,SAY_SLAY_4), me); }
void UpdateAI(const uint32 diff) { if (Intro) { if (AggroTimer <= diff) { me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); DoScriptText(SAY_AGGRO, me); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE); Intro = false; if (AggroTargetGUID) { Unit* pUnit = Unit::GetUnit((*me), AggroTargetGUID); if (pUnit) AttackStart(pUnit); DoZoneInCombat(); } else { EnterEvadeMode(); return; } } else AggroTimer -= diff; } if (!UpdateVictim() || Intro) return; if (SummonShadowsTimer <= diff) { //MindControlGhost(); for (uint8 i = 0; i < 2; ++i) { Creature* Shadow = NULL; float X = CalculateRandomLocation(me->GetPositionX(), 10); Shadow = me->SummonCreature(CREATURE_SHADOWY_CONSTRUCT, X, me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 0); if (Shadow) { Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 1); if (!pTarget) pTarget = me->getVictim(); if (pTarget) Shadow->AI()->AttackStart(pTarget); } } SummonShadowsTimer = 60000; } else SummonShadowsTimer -= diff; if (SummonDoomBlossomTimer <= diff) { if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) { float X = CalculateRandomLocation(pTarget->GetPositionX(), 20); float Y = CalculateRandomLocation(pTarget->GetPositionY(), 20); float Z = pTarget->GetPositionZ(); Z = me->GetMap()->GetHeight(X, Y, Z); Creature* DoomBlossom = me->SummonCreature(CREATURE_DOOM_BLOSSOM, X, Y, Z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 20000); if (DoomBlossom) { DoomBlossom->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); DoomBlossom->setFaction(me->getFaction()); DoomBlossom->AddThreat(pTarget, 1.0f); CAST_AI(mob_doom_blossomAI, DoomBlossom->AI())->SetTeronGUID(me->GetGUID()); pTarget->CombatStart(DoomBlossom); SetThreatList(DoomBlossom); SummonDoomBlossomTimer = 35000; } } } else SummonDoomBlossomTimer -= diff; if (IncinerateTimer <= diff) { Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 1); if (!pTarget) pTarget = me->getVictim(); if (pTarget) { DoScriptText(RAND(SAY_SPECIAL1,SAY_SPECIAL2), me); DoCast(pTarget, SPELL_INCINERATE); IncinerateTimer = 20000 + rand()%31 * 1000; } } else IncinerateTimer -= diff; if (CrushingShadowsTimer <= diff) { Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0); if (pTarget && pTarget->isAlive()) DoCast(pTarget, SPELL_CRUSHING_SHADOWS); CrushingShadowsTimer = 10000 + rand()%16 * 1000; } else CrushingShadowsTimer -= diff; /*** NOTE FOR FUTURE DEV: UNCOMMENT BELOW ONLY IF MIND CONTROL IS FULLY IMPLEMENTED **/ /*if (ShadowOfDeathTimer <= diff) { Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 1); if (!pTarget) pTarget = me->getVictim(); if (pTarget && pTarget->isAlive() && pTarget->GetTypeId() == TYPEID_PLAYER) { DoCast(pTarget, SPELL_SHADOW_OF_DEATH); GhostGUID = pTarget->GetGUID(); ShadowOfDeathTimer = 30000; SummonShadowsTimer = 53000; // Make it VERY close but slightly less so that we can check if the aura is still on the player } } else ShadowOfDeathTimer -= diff;*/ if (RandomYellTimer <= diff) { DoScriptText(RAND(SAY_SPELL1,SAY_SPELL2), me); RandomYellTimer = 50000 + rand()%51 * 1000; } else RandomYellTimer -= diff; if (!me->HasAura(SPELL_BERSERK, 0)) { if (EnrageTimer <= diff) { DoCast(me, SPELL_BERSERK); DoScriptText(SAY_ENRAGE, me); } else EnrageTimer -= diff; } DoMeleeAttackIfReady(); }
void KilledUnit(Unit * victim) { if (victim == me) return; DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2,SAY_SLAY_3), me); }
void KilledUnit(Unit* /*victim*/) { if (!urand(0, 2)) DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2), me); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; events.Update(diff); if (me->HasUnitState(UNIT_STAT_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_JET: me->MonsterTextEmote(EMOTE_JETS, 0, true); DoCast(me, SPELL_FLAME_JETS); events.ScheduleEvent(EVENT_JET, urand(35000, 40000)); break; case EVENT_SLAG_POT: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) { DoScriptText(SAY_SLAG_POT, me); _slagPotGUID = target->GetGUID(); DoCast(target, SPELL_GRAB); events.DelayEvents(3000); events.ScheduleEvent(EVENT_GRAB_POT, 500); } events.ScheduleEvent(EVENT_SLAG_POT, RAID_MODE(30000, 15000)); break; case EVENT_GRAB_POT: if (Unit* slagPotTarget = ObjectAccessor::GetUnit(*me, _slagPotGUID)) { slagPotTarget->EnterVehicle(me, 0); events.CancelEvent(EVENT_GRAB_POT); events.ScheduleEvent(EVENT_CHANGE_POT, 1000); } break; case EVENT_CHANGE_POT: if (Unit* slagPotTarget = ObjectAccessor::GetUnit(*me, _slagPotGUID)) { slagPotTarget->AddAura(SPELL_SLAG_POT, slagPotTarget); slagPotTarget->EnterVehicle(me, 1); events.CancelEvent(EVENT_CHANGE_POT); events.ScheduleEvent(EVENT_END_POT, 10000); } break; case EVENT_END_POT: if (Unit* slagPotTarget = ObjectAccessor::GetUnit(*me, _slagPotGUID)) { slagPotTarget->ExitVehicle(); slagPotTarget = NULL; _slagPotGUID = 0; events.CancelEvent(EVENT_END_POT); } break; case EVENT_SCORCH: DoScriptText(RAND(SAY_SCORCH_1, SAY_SCORCH_2), me); if (Unit* target = me->getVictim()) me->SummonCreature(NPC_GROUND_SCORCH, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 45000); DoCast(SPELL_SCORCH); events.ScheduleEvent(EVENT_SCORCH, 25000); break; case EVENT_CONSTRUCT: DoScriptText(SAY_SUMMON, me); DoSummon(NPC_IRON_CONSTRUCT, ConstructSpawnPosition[urand(0, CONSTRUCT_SPAWN_POINTS - 1)], 30000, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT); DoCast(SPELL_STRENGHT); DoCast(me, SPELL_ACTIVATE_CONSTRUCT); events.ScheduleEvent(EVENT_CONSTRUCT, RAID_MODE(40000, 30000)); break; case EVENT_BERSERK: DoCast(me, SPELL_BERSERK, true); DoScriptText(SAY_BERSERK, me); break; } } DoMeleeAttackIfReady(); }