void UpdateAI(const uint32 diff) { //Return since we have no target if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; //MortalWound_Timer if (MortalWound_Timer < diff) { DoCastSpellIfCan(m_creature->getVictim(),SPELL_MORTAL_WOUND); MortalWound_Timer = urand(10000, 20000); }else MortalWound_Timer -= diff; //Summon 1-3 Spawns of Fankriss at random time. if (SpawnSpawns_Timer < diff) { switch(urand(0, 2)) { case 0: SummonSpawn(SelectUnit(SELECT_TARGET_RANDOM,0)); break; case 1: SummonSpawn(SelectUnit(SELECT_TARGET_RANDOM,0)); SummonSpawn(SelectUnit(SELECT_TARGET_RANDOM,0)); break; case 2: SummonSpawn(SelectUnit(SELECT_TARGET_RANDOM,0)); SummonSpawn(SelectUnit(SELECT_TARGET_RANDOM,0)); SummonSpawn(SelectUnit(SELECT_TARGET_RANDOM,0)); break; } SpawnSpawns_Timer = urand(30000, 60000); }else SpawnSpawns_Timer -= diff; // Teleporting Random Target to one of the three tunnels and spawn 4 hatchlings near the gamer. //We will only telport if fankriss has more than 3% of hp so teleported gamers can always loot. if (m_creature->GetHealthPercent() > 3.0f) { if (SpawnHatchlings_Timer< diff) { Unit* target = NULL; target = SelectUnit(SELECT_TARGET_RANDOM,0); if (target && target->GetTypeId() == TYPEID_PLAYER) { DoCastSpellIfCan(target, SPELL_ROOT); if (m_creature->getThreatManager().getThreat(target)) m_creature->getThreatManager().modifyThreatPercent(target, -100); switch(urand(0, 2)) { case 0: DoTeleportPlayer(target, -8106.0142f, 1289.2900f, -74.419533f, 5.112f); Hatchling = m_creature->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()-3, target->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) ((CreatureAI*)Hatchling->AI())->AttackStart(target); Hatchling = m_creature->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()+3, target->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) ((CreatureAI*)Hatchling->AI())->AttackStart(target); Hatchling = m_creature->SummonCreature(15962, target->GetPositionX()-5, target->GetPositionY()-5, target->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) ((CreatureAI*)Hatchling->AI())->AttackStart(target); Hatchling = m_creature->SummonCreature(15962, target->GetPositionX()-5, target->GetPositionY()+5, target->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) ((CreatureAI*)Hatchling->AI())->AttackStart(target); break; case 1: DoTeleportPlayer(target, -7990.135354f, 1155.1907f, -78.849319f, 2.608f); Hatchling = m_creature->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()-3, target->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) ((CreatureAI*)Hatchling->AI())->AttackStart(target); Hatchling = m_creature->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()+3, target->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) ((CreatureAI*)Hatchling->AI())->AttackStart(target); Hatchling = m_creature->SummonCreature(15962, target->GetPositionX()-5, target->GetPositionY()-5, target->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) ((CreatureAI*)Hatchling->AI())->AttackStart(target); Hatchling = m_creature->SummonCreature(15962, target->GetPositionX()-5, target->GetPositionY()+5, target->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) ((CreatureAI*)Hatchling->AI())->AttackStart(target); break; case 2: DoTeleportPlayer(target, -8159.7753f, 1127.9064f, -76.868660f, 0.675f); Hatchling = m_creature->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()-3, target->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) ((CreatureAI*)Hatchling->AI())->AttackStart(target); Hatchling = m_creature->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()+3, target->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) ((CreatureAI*)Hatchling->AI())->AttackStart(target); Hatchling = m_creature->SummonCreature(15962, target->GetPositionX()-5, target->GetPositionY()-5, target->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) ((CreatureAI*)Hatchling->AI())->AttackStart(target); Hatchling = m_creature->SummonCreature(15962, target->GetPositionX()-5, target->GetPositionY()+5, target->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) ((CreatureAI*)Hatchling->AI())->AttackStart(target); break; } } SpawnHatchlings_Timer = urand(45000, 60000); }else SpawnHatchlings_Timer -= diff; } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) override { if (!UpdateVictim()) return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_BRAIN_WASH_TOTEM: DoCast(me, SPELL_BRAIN_WASH_TOTEM); events.ScheduleEvent(EVENT_BRAIN_WASH_TOTEM, urand(18000, 26000)); break; case EVENT_POWERFULL_HEALING_WARD: DoCast(me, SPELL_POWERFULL_HEALING_WARD); events.ScheduleEvent(EVENT_POWERFULL_HEALING_WARD, urand(14000, 20000)); break; case EVENT_HEX: if (Unit* target = me->GetVictim()) { DoCast(target, SPELL_HEX, true); if (DoGetThreat(target)) DoModifyThreatPercent(target, -80); } events.ScheduleEvent(EVENT_HEX, urand(12000, 20000)); break; case EVENT_DELUSIONS_OF_JINDO: // Casting the delusion curse with a shade so shade will attack the same target with the curse. if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) { DoCast(target, SPELL_SHADE_OF_JINDO, true); DoCast(target, SPELL_DELUSIONS_OF_JINDO); } events.ScheduleEvent(EVENT_DELUSIONS_OF_JINDO, urand(4000, 12000)); break; case EVENT_TELEPORT: // Teleports a random player and spawns 9 Sacrificed Trolls to attack player if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) { DoTeleportPlayer(target, TeleportLoc.GetPositionX(), TeleportLoc.GetPositionY(), TeleportLoc.GetPositionZ(), TeleportLoc.GetOrientation()); if (DoGetThreat(me->GetVictim())) DoModifyThreatPercent(target, -100); // Summon a formation of trolls for (uint8 i = 0; i < 10; ++i) if (Creature* SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, Formation[i].GetPositionX(), Formation[i].GetPositionY(), Formation[i].GetPositionZ(), Formation[i].GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000)) SacrificedTroll->AI()->AttackStart(target); } events.ScheduleEvent(EVENT_TELEPORT, urand(15000, 23000)); break; default: break; } } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) override { if (!UpdateVictim()) return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_MANA_STORM: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 60.0f, true)) DoCast(target, SPELL_MANA_STORM); events.ScheduleEvent(EVENT_MANA_STORM, urand(7500, 12500)); break; case EVENT_CHILL: DoCastVictim(SPELL_CHILL); events.ScheduleEvent(EVENT_CHILL, urand(13000, 25000)); break; case EVENT_BREATH: DoCastVictim(SPELL_FROST_BREATH); events.ScheduleEvent(EVENT_BREATH, urand(10000, 15000)); break; case EVENT_TELEPORT: { Talk(SAY_TELEPORT); ThreatContainer::StorageType const& threatlist = me->getThreatManager().getThreatList(); for (ThreatContainer::StorageType::const_iterator i = threatlist.begin(); i != threatlist.end(); ++i) { if (Player* player = ObjectAccessor::GetPlayer(*me, (*i)->getUnitGuid())) DoTeleportPlayer(player, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+3, player->GetOrientation()); } DoResetThreat(); events.ScheduleEvent(EVENT_TELEPORT, 30000); break; } case EVENT_REFLECT: DoCast(me, SPELL_REFLECT); events.ScheduleEvent(EVENT_REFLECT, urand(20000, 35000)); break; case EVENT_CLEAVE: DoCastVictim(SPELL_CLEAVE); events.ScheduleEvent(EVENT_CLEAVE, 7000); break; default: break; } } if (HealthBelowPct(26) && !_enraged) { DoCast(me, SPELL_ENRAGE); _enraged = true; } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; //BrainWashTotem_Timer if (BrainWashTotem_Timer < diff) { DoCast(m_creature, SPELL_BRAINWASHTOTEM); BrainWashTotem_Timer = 18000 + rand()%8000; }else BrainWashTotem_Timer -= diff; //HealingWard_Timer if (HealingWard_Timer < diff) { //DoCast(m_creature, SPELL_POWERFULLHEALINGWARD); HealingWard = m_creature->SummonCreature(14987, m_creature->GetPositionX()+3, m_creature->GetPositionY()-2, m_creature->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,30000); HealingWard_Timer = 14000 + rand()%6000; }else HealingWard_Timer -= diff; //Hex_Timer if (Hex_Timer < diff) { DoCast(m_creature->getVictim(), SPELL_HEX); if(DoGetThreat(m_creature->getVictim())) DoModifyThreatPercent(m_creature->getVictim(),-80); Hex_Timer = 12000 + rand()%8000; }else Hex_Timer -= diff; //Casting the delusion curse with a shade. So shade will attack the same target with the curse. if (Delusions_Timer < diff) { if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0)) { DoCast(target, SPELL_DELUSIONSOFJINDO); Shade = m_creature->SummonCreature(14986, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if(Shade) Shade->AI()->AttackStart(target); } Delusions_Timer = 4000 + rand()%8000; }else Delusions_Timer -= diff; //Teleporting a random gamer and spawning 9 skeletons that will attack this gamer if (Teleport_Timer < diff) { Unit* target = NULL; target = SelectUnit(SELECT_TARGET_RANDOM,0); if (target && target->GetTypeId() == TYPEID_PLAYER) { DoTeleportPlayer(target, -11583.7783,-1249.4278,77.5471,4.745); if(DoGetThreat(m_creature->getVictim())) DoModifyThreatPercent(target,-100); Skeletons = m_creature->SummonCreature(14826, target->GetPositionX()+2, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if(Skeletons) Skeletons->AI()->AttackStart(target); Skeletons = m_creature->SummonCreature(14826, target->GetPositionX()-2, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if(Skeletons) Skeletons->AI()->AttackStart(target); Skeletons = m_creature->SummonCreature(14826, target->GetPositionX()+4, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if(Skeletons) Skeletons->AI()->AttackStart(target); Skeletons = m_creature->SummonCreature(14826, target->GetPositionX()-4, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if(Skeletons) Skeletons->AI()->AttackStart(target); Skeletons = m_creature->SummonCreature(14826, target->GetPositionX(), target->GetPositionY()+2, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if(Skeletons) Skeletons->AI()->AttackStart(target); Skeletons = m_creature->SummonCreature(14826, target->GetPositionX(), target->GetPositionY()-2, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if(Skeletons) Skeletons->AI()->AttackStart(target); Skeletons = m_creature->SummonCreature(14826, target->GetPositionX(), target->GetPositionY()+4, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if(Skeletons) Skeletons->AI()->AttackStart(target); Skeletons = m_creature->SummonCreature(14826, target->GetPositionX(), target->GetPositionY()-4, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if(Skeletons) Skeletons->AI()->AttackStart(target); Skeletons = m_creature->SummonCreature(14826, target->GetPositionX()+3, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if(Skeletons) Skeletons->AI()->AttackStart(target); } Teleport_Timer = 15000 + rand()%8000; }else Teleport_Timer -= diff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!m_creature->SelectHostilTarget() || !m_creature->getVictim()) return; //ArcaneMissiles_Timer if (ArcaneMissiles_Timer < diff) { DoCast(m_creature->getVictim(),SPELL_ARCANEMISSILES); ArcaneMissiles_Timer = 8000; }else ArcaneMissiles_Timer -= diff; //ShadowShield_Timer if (ShadowShield_Timer < diff) { DoCast(m_creature,SPELL_SHADOWSHIELD); ShadowShield_Timer = 14000 + rand()%14000; }else ShadowShield_Timer -= diff; //Curse_Timer if (Curse_Timer < diff) { DoCast(m_creature->getVictim(),SPELL_CURSE); Curse_Timer = 15000 + rand()%12000; }else Curse_Timer -= diff; //Teleporting Random Target to one of the six pre boss rooms and spawn 3-4 skeletons near the gamer. //We will only telport if gandling has more than 3% of hp so teleported gamers can always loot. if ( m_creature->GetHealth()*100 / m_creature->GetMaxHealth() > 3 ) { if(Teleport_Timer < diff) { Unit* target = NULL; target = SelectUnit(SELECT_TARGET_RANDOM,0); if (target && target->GetTypeId() == TYPEID_PLAYER) { if(m_creature->getThreatManager().getThreat(target)) m_creature->getThreatManager().modifyThreatPercent(target, -100); switch(rand()%6) { case 0: DoTeleportPlayer(target, 250.0696,0.3921,84.8408,3.149); Summoned = m_creature->SummonCreature(16119,254.2325,0.3417,84.8407,0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); ((CreatureAI*)Summoned->AI())->AttackStart(target); Summoned = m_creature->SummonCreature(16119,257.7133,4.0226,84.8407,0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); ((CreatureAI*)Summoned->AI())->AttackStart(target); Summoned = m_creature->SummonCreature(16119,258.6702,-2.60656,84.8407,0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); ((CreatureAI*)Summoned->AI())->AttackStart(target); break; case 1: DoTeleportPlayer(target, 181.4220,-91.9481,84.8410,1.608); Summoned = m_creature->SummonCreature(16119,184.0519,-73.5649,84.8407,0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); ((CreatureAI*)Summoned->AI())->AttackStart(target); Summoned = m_creature->SummonCreature(16119,179.5951,-73.7045,84.8407,0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); ((CreatureAI*)Summoned->AI())->AttackStart(target); Summoned = m_creature->SummonCreature(16119,180.6452,-78.2143,84.8407,0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); ((CreatureAI*)Summoned->AI())->AttackStart(target); Summoned = m_creature->SummonCreature(16119,283.2274,-78.1518,84.8407,0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); ((CreatureAI*)Summoned->AI())->AttackStart(target); break; case 2: DoTeleportPlayer(target, 95.1547,-1.8173,85.2289,0.043); Summoned = m_creature->SummonCreature(16119,100.9404,-1.8016,85.2289,0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); ((CreatureAI*)Summoned->AI())->AttackStart(target); Summoned = m_creature->SummonCreature(16119,101.3729,0.4882,85.2289,0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); ((CreatureAI*)Summoned->AI())->AttackStart(target); Summoned = m_creature->SummonCreature(16119,101.4596,-4.4740,85.2289,0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); ((CreatureAI*)Summoned->AI())->AttackStart(target); break; case 3: DoTeleportPlayer(target, 250.0696,0.3921,72.6722,3.149); Summoned = m_creature->SummonCreature(16119,240.34481,0.7368,72.6722,0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); ((CreatureAI*)Summoned->AI())->AttackStart(target); Summoned = m_creature->SummonCreature(16119,240.3633,-2.9520,72.6722,0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); ((CreatureAI*)Summoned->AI())->AttackStart(target); Summoned = m_creature->SummonCreature(16119,240.6702,3.34949,72.6722,0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); ((CreatureAI*)Summoned->AI())->AttackStart(target); break; case 4: DoTeleportPlayer(target, 181.4220,-91.9481,70.7734,1.608); Summoned = m_creature->SummonCreature(16119,184.0519,-73.5649,70.7734,0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); ((CreatureAI*)Summoned->AI())->AttackStart(target); Summoned = m_creature->SummonCreature(16119,179.5951,-73.7045,70.7734,0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); ((CreatureAI*)Summoned->AI())->AttackStart(target); Summoned = m_creature->SummonCreature(16119,180.6452,-78.2143,70.7734,0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); ((CreatureAI*)Summoned->AI())->AttackStart(target); Summoned = m_creature->SummonCreature(16119,283.2274,-78.1518,70.7734,0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); ((CreatureAI*)Summoned->AI())->AttackStart(target); break; case 5: DoTeleportPlayer(target, 106.1541,-1.8994,75.3663,0.043); Summoned = m_creature->SummonCreature(16119,115.3945,-1.5555,75.3663,0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); ((CreatureAI*)Summoned->AI())->AttackStart(target); Summoned = m_creature->SummonCreature(16119,257.7133,1.8066,75.3663,0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); ((CreatureAI*)Summoned->AI())->AttackStart(target); Summoned = m_creature->SummonCreature(16119,258.6702,-5.1001,75.3663,0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); ((CreatureAI*)Summoned->AI())->AttackStart(target); break; } } Teleport_Timer = 20000 + rand()%15000; }else Teleport_Timer -= diff; } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { //Return since we have no target if (!UpdateVictim()) return; if (Teleport_Timer <= diff) { DoScriptText(SAY_TELEPORT, me); std::list<HostileReference*>& m_threatlist = me->getThreatManager().getThreatList(); std::list<HostileReference*>::const_iterator i = m_threatlist.begin(); for (i = m_threatlist.begin(); i!= m_threatlist.end(); ++i) { Unit* pUnit = Unit::GetUnit((*me), (*i)->getUnitGuid()); if (pUnit && (pUnit->GetTypeId() == TYPEID_PLAYER)) { DoTeleportPlayer(pUnit, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+3, pUnit->GetOrientation()); } } DoResetThreat(); Teleport_Timer = 30000; } else Teleport_Timer -= diff; // //MarkOfFrost_Timer // if (MarkOfFrost_Timer <= diff) // { // DoCast(me->getVictim(), SPELL_MARKOFFROST); // MarkOfFrost_Timer = 25000; // } else MarkOfFrost_Timer -= diff; //Chill_Timer if (Chill_Timer <= diff) { DoCast(me->getVictim(), SPELL_CHILL); Chill_Timer = 13000 + rand()%12000; } else Chill_Timer -= diff; //Breath_Timer if (Breath_Timer <= diff) { DoCast(me->getVictim(), SPELL_FROSTBREATH); Breath_Timer = 10000 + rand()%5000; } else Breath_Timer -= diff; //ManaStorm_Timer if (ManaStorm_Timer <= diff) { if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0)) DoCast(pTarget, SPELL_MANASTORM); ManaStorm_Timer = 7500 + rand()%5000; } else ManaStorm_Timer -= diff; //Reflect_Timer if (Reflect_Timer <= diff) { DoCast(me, SPELL_REFLECT); Reflect_Timer = 20000 + rand()%15000; } else Reflect_Timer -= diff; //Cleave_Timer if (Cleave_Timer <= diff) { DoCast(me->getVictim(), SPELL_CLEAVE); Cleave_Timer = 7000; } else Cleave_Timer -= diff; //Enrage_Timer if (me->GetHealth()*100 / me->GetMaxHealth() < 26 && !Enraged) { DoCast(me, SPELL_ENRAGE); Enraged = true; } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { //Return since we have no target if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; if (Teleport) { if (Teleport_Timer <= diff) { m_creature->NearTeleportTo(LOCX, LOCY, LOCZ, 0.0f); float ranX = LOCX; float ranY = LOCY; float ranZ = LOCZ; ThreatList const& tList = m_creature->getThreatManager().getThreatList(); for (ThreatList::const_iterator itr = tList.begin();itr != tList.end(); ++itr) { Unit* target = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid()); if (target && target->GetTypeId() == TYPEID_PLAYER) { target->GetRandomPoint(LOCX,LOCY,LOCZ,3.0f,ranX,ranY,ranZ); DoTeleportPlayer(target,ranX,ranY,ranZ,m_creature->GetAngle(m_creature->GetPositionX(),m_creature->GetPositionY())); } } Teleport = false; DoCastSpellIfCan(m_creature->getVictim(), m_bIsRegularMode ? SPELL_RAIN_OF_FIRE : H_SPELL_RAIN_OF_FIRE); Teleport_Timer = 1000; }else Teleport_Timer -= diff; } if (ShadowBoltVolley_Timer < diff) { DoCastSpellIfCan(m_creature->getVictim(), SPELL_SHADOW_BOLT_VOLLEY); ShadowBoltVolley_Timer = urand(15000, 30000); }else ShadowBoltVolley_Timer -= diff; if (DrawShadows_Timer < diff) { DoCastSpellIfCan(m_creature,SPELL_DRAW_SHADOWS); DrawShadows_Timer = 30000; Teleport = true; }else DrawShadows_Timer -= diff; if (VoidTraveler_Timer < diff) { DoScriptText(SAY_HELP, m_creature); switch(urand(0, 4)) { case 0: DoCastSpellIfCan(m_creature, SPELL_SUMMON_VOIDWALKER_A, CAST_TRIGGERED); break; case 1: DoCastSpellIfCan(m_creature, SPELL_SUMMON_VOIDWALKER_B, CAST_TRIGGERED); break; case 2: DoCastSpellIfCan(m_creature, SPELL_SUMMON_VOIDWALKER_C, CAST_TRIGGERED); break; case 3: DoCastSpellIfCan(m_creature, SPELL_SUMMON_VOIDWALKER_D, CAST_TRIGGERED); break; case 4: DoCastSpellIfCan(m_creature, SPELL_SUMMON_VOIDWALKER_E, CAST_TRIGGERED); break; } //faster rate when below (X) health? VoidTraveler_Timer = 35000; }else VoidTraveler_Timer -= diff; if (!m_bIsRegularMode) { if (Banish_Timer < diff) { if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 1)) DoCastSpellIfCan(target,H_SPELL_BANISH); Banish_Timer = 35000; }else Banish_Timer -= diff; } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { //Return since we have no target if (!UpdateVictim()) return; //MortalWound_Timer if (MortalWound_Timer < diff) { DoCast(m_creature->getVictim(),SPELL_MORTAL_WOUND); MortalWound_Timer = 10000 + rand()%10000; }else MortalWound_Timer -= diff; //Summon 1-3 Spawns of Fankriss at random time. if (SpawnSpawns_Timer < diff) { switch(rand()%3) { case 0: SummonSpawn(SelectUnit(SELECT_TARGET_RANDOM,0)); break; case 1: SummonSpawn(SelectUnit(SELECT_TARGET_RANDOM,0)); SummonSpawn(SelectUnit(SELECT_TARGET_RANDOM,0)); break; case 2: SummonSpawn(SelectUnit(SELECT_TARGET_RANDOM,0)); SummonSpawn(SelectUnit(SELECT_TARGET_RANDOM,0)); SummonSpawn(SelectUnit(SELECT_TARGET_RANDOM,0)); break; } SpawnSpawns_Timer = 30000 + rand()%30000; }else SpawnSpawns_Timer -= diff; // Teleporting Random Target to one of the three tunnels and spawn 4 hatchlings near the gamer. //We will only telport if fankriss has more than 3% of hp so teleported gamers can always loot. if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() > 3) { if (SpawnHatchlings_Timer< diff) { Unit* target = NULL; target = SelectUnit(SELECT_TARGET_RANDOM,0); if (target && target->GetTypeId() == TYPEID_PLAYER) { DoCast(target, SPELL_ROOT); if (DoGetThreat(target)) DoModifyThreatPercent(target, -100); switch(rand()%3) { case 0: DoTeleportPlayer(target, -8106.0142,1289.2900,-74.419533,5.112); Hatchling = m_creature->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()-3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) (Hatchling->AI())->AttackStart(target); Hatchling = m_creature->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()+3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) (Hatchling->AI())->AttackStart(target); Hatchling = m_creature->SummonCreature(15962, target->GetPositionX()-5, target->GetPositionY()-5, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) (Hatchling->AI())->AttackStart(target); Hatchling = m_creature->SummonCreature(15962, target->GetPositionX()-5, target->GetPositionY()+5, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) (Hatchling->AI())->AttackStart(target); break; case 1: DoTeleportPlayer(target, -7990.135354,1155.1907,-78.849319,2.608); Hatchling = m_creature->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()-3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) (Hatchling->AI())->AttackStart(target); Hatchling = m_creature->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()+3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) (Hatchling->AI())->AttackStart(target); Hatchling = m_creature->SummonCreature(15962, target->GetPositionX()-5, target->GetPositionY()-5, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) (Hatchling->AI())->AttackStart(target); Hatchling = m_creature->SummonCreature(15962, target->GetPositionX()-5, target->GetPositionY()+5, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) (Hatchling->AI())->AttackStart(target); break; case 2: DoTeleportPlayer(target,-8159.7753,1127.9064,-76.868660,0.675); Hatchling = m_creature->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()-3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) (Hatchling->AI())->AttackStart(target); Hatchling = m_creature->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()+3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) (Hatchling->AI())->AttackStart(target); Hatchling = m_creature->SummonCreature(15962, target->GetPositionX()-5, target->GetPositionY()-5, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) (Hatchling->AI())->AttackStart(target); Hatchling = m_creature->SummonCreature(15962, target->GetPositionX()-5, target->GetPositionY()+5, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) (Hatchling->AI())->AttackStart(target); break; } } SpawnHatchlings_Timer = 45000 + rand()%15000; }else SpawnHatchlings_Timer -= diff; } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 uiDiff) { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; // Arcane Missiles Timer if (m_uiArcaneMissilesTimer < uiDiff) { if (DoCastSpellIfCan(m_creature->getVictim(), SPELL_ARCANE_MISSILES) == CAST_OK) m_uiArcaneMissilesTimer = 8000; } else m_uiArcaneMissilesTimer -= uiDiff; // Shadow Shield Timer if (m_uiShadowShieldTimer < uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_SHADOW_SHIELD) == CAST_OK) m_uiShadowShieldTimer = urand(14000, 28000); } else m_uiShadowShieldTimer -= uiDiff; // Curse Timer if (m_uiCurseTimer < uiDiff) { if (DoCastSpellIfCan(m_creature->getVictim(), SPELL_CURSE) == CAST_OK) m_uiCurseTimer = urand(15000, 27000); } else m_uiCurseTimer -= uiDiff; // Teleporting Random Target to one of the six pre boss rooms and spawn 3-4 skeletons near the gamer. // We will only telport if gandling has more than 3% of hp so teleported gamers can always loot. if (m_creature->GetHealthPercent() > 3.0f) { if (m_uiTeleportTimer < uiDiff) { Unit* target = NULL; target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,0); if (target && target->GetTypeId() == TYPEID_PLAYER) { if (m_creature->getThreatManager().getThreat(target)) m_creature->getThreatManager().modifyThreatPercent(target, -100); switch(urand(0, 5)) { case 0: DoTeleportPlayer(target, 250.0696f, 0.3921f, 84.8408f, 3.149f); Summoned = m_creature->SummonCreature(16119, 254.2325f, 0.3417f, 84.8407f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); if (Summoned) Summoned->AI()->AttackStart(target); Summoned = m_creature->SummonCreature(16119, 257.7133f, 4.0226f, 84.8407f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); if (Summoned) Summoned->AI()->AttackStart(target); Summoned = m_creature->SummonCreature(16119, 258.6702f, -2.60656f, 84.8407f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); if (Summoned) Summoned->AI()->AttackStart(target); break; case 1: DoTeleportPlayer(target, 181.4220f, -91.9481f, 84.8410f, 1.608f); Summoned = m_creature->SummonCreature(16119, 184.0519f, -73.5649f, 84.8407f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); if (Summoned) Summoned->AI()->AttackStart(target); Summoned = m_creature->SummonCreature(16119, 179.5951f, -73.7045f, 84.8407f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); if (Summoned) Summoned->AI()->AttackStart(target); Summoned = m_creature->SummonCreature(16119, 180.6452f, -78.2143f, 84.8407f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); if (Summoned) Summoned->AI()->AttackStart(target); Summoned = m_creature->SummonCreature(16119, 283.2274f, -78.1518f, 84.8407f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); if (Summoned) Summoned->AI()->AttackStart(target); break; case 2: DoTeleportPlayer(target, 95.1547f, -1.8173f, 85.2289f, 0.043f); Summoned = m_creature->SummonCreature(16119, 100.9404f, -1.8016f, 85.2289f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); if (Summoned) Summoned->AI()->AttackStart(target); Summoned = m_creature->SummonCreature(16119, 101.3729f, 0.4882f, 85.2289f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); if (Summoned) Summoned->AI()->AttackStart(target); Summoned = m_creature->SummonCreature(16119, 101.4596f, -4.4740f, 85.2289f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); if (Summoned) Summoned->AI()->AttackStart(target); break; case 3: DoTeleportPlayer(target, 250.0696f, 0.3921f, 72.6722f, 3.149f); Summoned = m_creature->SummonCreature(16119, 240.34481f, 0.7368f, 72.6722f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); if (Summoned) Summoned->AI()->AttackStart(target); Summoned = m_creature->SummonCreature(16119, 240.3633f, -2.9520f, 72.6722f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); if (Summoned) Summoned->AI()->AttackStart(target); Summoned = m_creature->SummonCreature(16119, 240.6702f, 3.34949f, 72.6722f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); if (Summoned) Summoned->AI()->AttackStart(target); break; case 4: DoTeleportPlayer(target, 181.4220f, -91.9481f, 70.7734f, 1.608f); Summoned = m_creature->SummonCreature(16119, 184.0519f, -73.5649f, 70.7734f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); if (Summoned) Summoned->AI()->AttackStart(target); Summoned = m_creature->SummonCreature(16119, 179.5951f, -73.7045f, 70.7734f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); if (Summoned) Summoned->AI()->AttackStart(target); Summoned = m_creature->SummonCreature(16119, 180.6452f, -78.2143f, 70.7734f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); if (Summoned) Summoned->AI()->AttackStart(target); Summoned = m_creature->SummonCreature(16119, 283.2274f, -78.1518f, 70.7734f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); if (Summoned) Summoned->AI()->AttackStart(target); break; case 5: DoTeleportPlayer(target, 106.1541f, -1.8994f, 75.3663f, 0.043f); Summoned = m_creature->SummonCreature(16119, 115.3945f, -1.5555f, 75.3663f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); if (Summoned) Summoned->AI()->AttackStart(target); Summoned = m_creature->SummonCreature(16119, 257.7133f, 1.8066f, 75.3663f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); if (Summoned) Summoned->AI()->AttackStart(target); Summoned = m_creature->SummonCreature(16119, 258.6702f, -5.1001f, 75.3663f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,10000); if (Summoned) Summoned->AI()->AttackStart(target); break; } } m_uiTeleportTimer = urand(20000, 35000); } else m_uiTeleportTimer -= uiDiff; } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; //ArcaneMissiles_Timer if (ArcaneMissiles_Timer <= diff) { DoCast(me->getVictim(), SPELL_ARCANEMISSILES); ArcaneMissiles_Timer = 8000; } else ArcaneMissiles_Timer -= diff; //ShadowShield_Timer if (ShadowShield_Timer <= diff) { DoCast(me, SPELL_SHADOWSHIELD); ShadowShield_Timer = 14000 + rand()%14000; } else ShadowShield_Timer -= diff; //Curse_Timer if (Curse_Timer <= diff) { DoCast(me->getVictim(), SPELL_CURSE); Curse_Timer = 15000 + rand()%12000; } else Curse_Timer -= diff; //Teleporting Random Target to one of the six pre boss rooms and spawn 3-4 skeletons near the gamer. //We will only telport if gandling has more than 3% of hp so teleported gamers can always loot. if (HealthAbovePct(3)) { if (Teleport_Timer <= diff) { Unit *pTarget = NULL; pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0); if (pTarget && pTarget->GetTypeId() == TYPEID_PLAYER) { if (DoGetThreat(pTarget)) DoModifyThreatPercent(pTarget, -100); Creature *Summoned = NULL; switch(rand()%6) { case 0: DoTeleportPlayer(pTarget, 250.0696f, 0.3921f, 84.8408f, 3.149f); Summoned = me->SummonCreature(16119, 254.2325f, 0.3417f, 84.8407f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); if (Summoned) Summoned->AI()->AttackStart(pTarget); Summoned = me->SummonCreature(16119, 257.7133f, 4.0226f, 84.8407f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); if (Summoned) Summoned->AI()->AttackStart(pTarget); Summoned = me->SummonCreature(16119, 258.6702f, -2.60656f, 84.8407f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); if (Summoned) Summoned->AI()->AttackStart(pTarget); break; case 1: DoTeleportPlayer(pTarget, 181.4220f, -91.9481f, 84.8410f, 1.608f); Summoned = me->SummonCreature(16119, 184.0519f, -73.5649f, 84.8407f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); if (Summoned) Summoned->AI()->AttackStart(pTarget); Summoned = me->SummonCreature(16119, 179.5951f, -73.7045f, 84.8407f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); if (Summoned) Summoned->AI()->AttackStart(pTarget); Summoned = me->SummonCreature(16119, 180.6452f, -78.2143f, 84.8407f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); if (Summoned) Summoned->AI()->AttackStart(pTarget); Summoned = me->SummonCreature(16119, 283.2274f, -78.1518f, 84.8407f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); if (Summoned) Summoned->AI()->AttackStart(pTarget); break; case 2: DoTeleportPlayer(pTarget, 95.1547f, -1.8173f, 85.2289f, 0.043f); Summoned = me->SummonCreature(16119, 100.9404f, -1.8016f, 85.2289f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); if (Summoned) Summoned->AI()->AttackStart(pTarget); Summoned = me->SummonCreature(16119, 101.3729f, 0.4882f, 85.2289f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); if (Summoned) Summoned->AI()->AttackStart(pTarget); Summoned = me->SummonCreature(16119, 101.4596f, -4.4740f, 85.2289f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); if (Summoned) Summoned->AI()->AttackStart(pTarget); break; case 3: DoTeleportPlayer(pTarget, 250.0696f, 0.3921f, 72.6722f, 3.149f); Summoned = me->SummonCreature(16119, 240.34481f, 0.7368f, 72.6722f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); if (Summoned) Summoned->AI()->AttackStart(pTarget); Summoned = me->SummonCreature(16119, 240.3633f, -2.9520f, 72.6722f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); if (Summoned) Summoned->AI()->AttackStart(pTarget); Summoned = me->SummonCreature(16119, 240.6702f, 3.34949f, 72.6722f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); if (Summoned) Summoned->AI()->AttackStart(pTarget); break; case 4: DoTeleportPlayer(pTarget, 181.4220f, -91.9481f, 70.7734f, 1.608f); Summoned = me->SummonCreature(16119, 184.0519f, -73.5649f, 70.7734f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); if (Summoned) Summoned->AI()->AttackStart(pTarget); Summoned = me->SummonCreature(16119, 179.5951f, -73.7045f, 70.7734f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); if (Summoned) Summoned->AI()->AttackStart(pTarget); Summoned = me->SummonCreature(16119, 180.6452f, -78.2143f, 70.7734f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); if (Summoned) Summoned->AI()->AttackStart(pTarget); Summoned = me->SummonCreature(16119, 283.2274f, -78.1518f, 70.7734f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); if (Summoned) Summoned->AI()->AttackStart(pTarget); break; case 5: DoTeleportPlayer(pTarget, 106.1541f, -1.8994f, 75.3663f, 0.043f); Summoned = me->SummonCreature(16119, 115.3945f, -1.5555f, 75.3663f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); if (Summoned) Summoned->AI()->AttackStart(pTarget); Summoned = me->SummonCreature(16119, 257.7133f, 1.8066f, 75.3663f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); if (Summoned) Summoned->AI()->AttackStart(pTarget); Summoned = me->SummonCreature(16119, 258.6702f, -5.1001f, 75.3663f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000); if (Summoned) Summoned->AI()->AttackStart(pTarget); break; } } Teleport_Timer = 20000 + rand()%15000; } else Teleport_Timer -= diff; } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) override { //Return since we have no target if (!UpdateVictim()) return; //MortalWound_Timer if (MortalWound_Timer <= diff) { DoCastVictim(SPELL_MORTAL_WOUND); MortalWound_Timer = urand(10000, 20000); } else MortalWound_Timer -= diff; //Summon 1-3 Spawns of Fankriss at random time. if (SpawnSpawns_Timer <= diff) { switch (urand(0, 2)) { case 0: SummonSpawn(SelectTarget(SELECT_TARGET_RANDOM, 0)); break; case 1: SummonSpawn(SelectTarget(SELECT_TARGET_RANDOM, 0)); SummonSpawn(SelectTarget(SELECT_TARGET_RANDOM, 0)); break; case 2: SummonSpawn(SelectTarget(SELECT_TARGET_RANDOM, 0)); SummonSpawn(SelectTarget(SELECT_TARGET_RANDOM, 0)); SummonSpawn(SelectTarget(SELECT_TARGET_RANDOM, 0)); break; } SpawnSpawns_Timer = urand(30000, 60000); } else SpawnSpawns_Timer -= diff; // Teleporting Random Target to one of the three tunnels and spawn 4 hatchlings near the gamer. //We will only telport if fankriss has more than 3% of hp so teleported gamers can always loot. if (HealthAbovePct(3)) { if (SpawnHatchlings_Timer <= diff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) { DoCast(target, SPELL_ROOT); if (DoGetThreat(target)) DoModifyThreatPercent(target, -100); switch (urand(0, 2)) { case 0: DoTeleportPlayer(target, -8106.0142f, 1289.2900f, -74.419533f, 5.112f); Hatchling = me->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()-3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) Hatchling->AI()->AttackStart(target); Hatchling = me->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()+3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) Hatchling->AI()->AttackStart(target); Hatchling = me->SummonCreature(15962, target->GetPositionX()-5, target->GetPositionY()-5, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) Hatchling->AI()->AttackStart(target); Hatchling = me->SummonCreature(15962, target->GetPositionX()-5, target->GetPositionY()+5, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) Hatchling->AI()->AttackStart(target); break; case 1: DoTeleportPlayer(target, -7990.135354f, 1155.1907f, -78.849319f, 2.608f); Hatchling = me->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()-3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) Hatchling->AI()->AttackStart(target); Hatchling = me->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()+3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) Hatchling->AI()->AttackStart(target); Hatchling = me->SummonCreature(15962, target->GetPositionX()-5, target->GetPositionY()-5, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) Hatchling->AI()->AttackStart(target); Hatchling = me->SummonCreature(15962, target->GetPositionX()-5, target->GetPositionY()+5, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) Hatchling->AI()->AttackStart(target); break; case 2: DoTeleportPlayer(target, -8159.7753f, 1127.9064f, -76.868660f, 0.675f); Hatchling = me->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()-3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) Hatchling->AI()->AttackStart(target); Hatchling = me->SummonCreature(15962, target->GetPositionX()-3, target->GetPositionY()+3, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) Hatchling->AI()->AttackStart(target); Hatchling = me->SummonCreature(15962, target->GetPositionX()-5, target->GetPositionY()-5, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) Hatchling->AI()->AttackStart(target); Hatchling = me->SummonCreature(15962, target->GetPositionX()-5, target->GetPositionY()+5, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); if (Hatchling) Hatchling->AI()->AttackStart(target); break; } } SpawnHatchlings_Timer = urand(45000, 60000); } else SpawnHatchlings_Timer -= diff; } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { if (isFlameBreathing) { if (!me->IsNonMeleeSpellCasted(false)) isFlameBreathing = false; else return; } if (isBombing) { if (BombSequenceTimer <= diff) HandleBombSequence(); else BombSequenceTimer -= diff; return; } if (!UpdateVictim()) return; //enrage if under 25% hp before 5 min. if (!enraged && HealthBelowPct(25)) EnrageTimer = 0; if (EnrageTimer <= diff) { if (!enraged) { DoCast(me, SPELL_ENRAGE, true); enraged = true; EnrageTimer = 300000; } else { Talk(SAY_BERSERK); DoCast(me, SPELL_BERSERK, true); EnrageTimer = 300000; } } else EnrageTimer -= diff; if (BombTimer <= diff) { Talk(SAY_FIRE_BOMBS); me->AttackStop(); me->GetMotionMaster()->Clear(); DoTeleportTo(JanalainPos[0][0], JanalainPos[0][1], JanalainPos[0][2]); me->StopMoving(); DoCast(me, SPELL_FIRE_BOMB_CHANNEL, false); //DoTeleportPlayer(me, JanalainPos[0][0], JanalainPos[0][1], JanalainPos[0][2], 0); //DoCast(me, SPELL_TELE_TO_CENTER, true); FireWall(); SpawnBombs(); isBombing = true; BombSequenceTimer = 100; //Teleport every Player into the middle Map* map = me->GetMap(); if (!map->IsDungeon()) return; Map::PlayerList const &PlayerList = map->GetPlayers(); for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) if (Player* i_pl = i->getSource()) if (i_pl->isAlive()) DoTeleportPlayer(i_pl, JanalainPos[0][0]-5+rand()%10, JanalainPos[0][1]-5+rand()%10, JanalainPos[0][2], 0); //DoCast(Temp, SPELL_SUMMON_PLAYERS, true) // core bug, spell does not work if too far return; } else BombTimer -= diff; if (!noeggs) { if (HealthBelowPct(35)) { Talk(SAY_ALL_EGGS); me->AttackStop(); me->GetMotionMaster()->Clear(); DoTeleportTo(JanalainPos[0][0], JanalainPos[0][1], JanalainPos[0][2]); me->StopMoving(); DoCast(me, SPELL_HATCH_ALL, false); HatchAllEggs(2); noeggs = true; } else if (HatcherTimer <= diff) { if (HatchAllEggs(0)) { Talk(SAY_SUMMON_HATCHER); me->SummonCreature(MOB_AMANI_HATCHER, hatcherway[0][0][0], hatcherway[0][0][1], hatcherway[0][0][2], 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); me->SummonCreature(MOB_AMANI_HATCHER, hatcherway[1][0][0], hatcherway[1][0][1], hatcherway[1][0][2], 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); HatcherTimer = 90000; } else noeggs = true; } else HatcherTimer -= diff; } EnterEvadeIfOutOfCombatArea(diff); DoMeleeAttackIfReady(); if (FireBreathTimer <= diff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) { me->AttackStop(); me->GetMotionMaster()->Clear(); DoCast(target, SPELL_FLAME_BREATH, false); me->StopMoving(); isFlameBreathing = true; } FireBreathTimer = 8000; } else FireBreathTimer -= diff; }
void UpdateAI(uint32 diff) override { //Check if we have a target if (!UpdateVictim()) { //No target so we'll use this section to do our random wispers instance wide //WisperTimer if (WisperTimer <= diff) { Map* map = me->GetMap(); if (!map->IsDungeon()) return; //Play random sound to the zone Map::PlayerList const &PlayerList = map->GetPlayers(); if (!PlayerList.isEmpty()) { for (Map::PlayerList::const_iterator itr = PlayerList.begin(); itr != PlayerList.end(); ++itr) { if (Player* pPlr = itr->GetSource()) pPlr->PlayDirectSound(RANDOM_SOUND_WHISPER, pPlr); } } //One random wisper every 90 - 300 seconds WisperTimer = urand(90000, 300000); } else WisperTimer -= diff; return; } me->SetTarget(ObjectGuid::Empty); uint32 currentPhase = instance->GetData(DATA_CTHUN_PHASE); if (currentPhase == PHASE_CTHUN_STOMACH || currentPhase == PHASE_CTHUN_WEAK) { // 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 = 30000; // every 30sec in phase 2 } else EyeTentacleTimer -= diff; } switch (currentPhase) { //Transition phase case PHASE_CTHUN_TRANSITION: //PhaseTimer if (PhaseTimer <= diff) { //Switch instance->SetData(DATA_CTHUN_PHASE, PHASE_CTHUN_STOMACH); //Switch to c'thun model me->InterruptNonMeleeSpells(false); DoCast(me, SPELL_TRANSFORM, false); me->SetFullHealth(); me->SetVisible(true); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); //Emerging phase //AttackStart(ObjectAccessor::GetUnit(*me, HoldpPlayer)); DoZoneInCombat(); //Place all units in threat list on outside of stomach Stomach_Map.clear(); for (std::list<HostileReference*>::const_iterator i = me->getThreatManager().getThreatList().begin(); i != me->getThreatManager().getThreatList().end(); ++i) Stomach_Map[(*i)->getUnitGuid()] = false; //Outside stomach //Spawn 2 flesh tentacles FleshTentaclesKilled = 0; //Spawn flesh tentacle for (uint8 i = 0; i < 2; i++) { Creature* spawned = me->SummonCreature(NPC_FLESH_TENTACLE, FleshTentaclePos[i], TEMPSUMMON_CORPSE_DESPAWN); if (!spawned) ++FleshTentaclesKilled; } PhaseTimer = 0; } else PhaseTimer -= diff; break; //Body Phase case PHASE_CTHUN_STOMACH: //Remove Target field me->SetTarget(ObjectGuid::Empty); //Weaken if (FleshTentaclesKilled > 1) { instance->SetData(DATA_CTHUN_PHASE, PHASE_CTHUN_WEAK); Talk(EMOTE_WEAKENED); PhaseTimer = 45000; DoCast(me, SPELL_PURPLE_COLORATION, true); std::unordered_map<ObjectGuid, bool>::iterator i = Stomach_Map.begin(); //Kick all players out of stomach while (i != Stomach_Map.end()) { //Check for valid player Unit* unit = ObjectAccessor::GetUnit(*me, i->first); //Only move units in stomach if (unit && i->second == true) { //Teleport each player out DoTeleportPlayer(unit, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 10, float(rand32() % 6)); //Cast knockback on them DoCast(unit, SPELL_EXIT_STOMACH_KNOCKBACK, true); //Remove the acid debuff unit->RemoveAurasDueToSpell(SPELL_DIGESTIVE_ACID); i->second = false; } ++i; } return; } //Stomach acid if (StomachAcidTimer <= diff) { //Apply aura to all players in stomach std::unordered_map<ObjectGuid, bool>::iterator i = Stomach_Map.begin(); while (i != Stomach_Map.end()) { //Check for valid player Unit* unit = ObjectAccessor::GetUnit(*me, i->first); //Only apply to units in stomach if (unit && i->second == true) { //Cast digestive acid on them DoCast(unit, SPELL_DIGESTIVE_ACID, true); //Check if player should be kicked from stomach if (unit->IsWithinDist3d(&KickPos, 15.0f)) { //Teleport each player out DoTeleportPlayer(unit, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 10, float(rand32() % 6)); //Cast knockback on them DoCast(unit, SPELL_EXIT_STOMACH_KNOCKBACK, true); //Remove the acid debuff unit->RemoveAurasDueToSpell(SPELL_DIGESTIVE_ACID); i->second = false; } } ++i; } StomachAcidTimer = 4000; } else StomachAcidTimer -= diff; //Stomach Enter Timer if (StomachEnterTimer <= diff) { if (Unit* target = SelectRandomNotStomach()) { //Set target in stomach Stomach_Map[target->GetGUID()] = true; target->InterruptNonMeleeSpells(false); target->CastSpell(target, SPELL_MOUTH_TENTACLE, true, NULL, NULL, me->GetGUID()); StomachEnterTarget = target->GetGUID(); StomachEnterVisTimer = 3800; } StomachEnterTimer = 13800; } else StomachEnterTimer -= diff; if (StomachEnterVisTimer && StomachEnterTarget) { if (StomachEnterVisTimer <= diff) { //Check for valid player Unit* unit = ObjectAccessor::GetUnit(*me, StomachEnterTarget); if (unit) { DoTeleportPlayer(unit, STOMACH_X, STOMACH_Y, STOMACH_Z, STOMACH_O); } StomachEnterTarget.Clear(); StomachEnterVisTimer = 0; } else StomachEnterVisTimer -= diff; } //GientClawTentacleTimer if (GiantClawTentacleTimer <= diff) { if (Unit* target = SelectRandomNotStomach()) { //Spawn claw tentacle on the random target if (Creature* spawned = me->SummonCreature(NPC_GIANT_CLAW_TENTACLE, *target, TEMPSUMMON_CORPSE_DESPAWN, 500)) if (spawned->AI()) spawned->AI()->AttackStart(target); } //One giant claw tentacle every minute GiantClawTentacleTimer = 60000; } else GiantClawTentacleTimer -= diff; //GiantEyeTentacleTimer if (GiantEyeTentacleTimer <= diff) { if (Unit* target = SelectRandomNotStomach()) { //Spawn claw tentacle on the random target if (Creature* spawned = me->SummonCreature(NPC_GIANT_EYE_TENTACLE, *target, TEMPSUMMON_CORPSE_DESPAWN, 500)) if (spawned->AI()) spawned->AI()->AttackStart(target); } //One giant eye tentacle every minute GiantEyeTentacleTimer = 60000; } else GiantEyeTentacleTimer -= diff; break; //Weakened state case PHASE_CTHUN_WEAK: //PhaseTimer if (PhaseTimer <= diff) { //Switch instance->SetData(DATA_CTHUN_PHASE, PHASE_CTHUN_STOMACH); //Remove purple coloration me->RemoveAurasDueToSpell(SPELL_PURPLE_COLORATION); //Spawn 2 flesh tentacles FleshTentaclesKilled = 0; //Spawn flesh tentacle for (uint8 i = 0; i < 2; i++) { Creature* spawned = me->SummonCreature(NPC_FLESH_TENTACLE, FleshTentaclePos[i], TEMPSUMMON_CORPSE_DESPAWN); if (!spawned) ++FleshTentaclesKilled; } PhaseTimer = 0; } else PhaseTimer -= diff; break; } }
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 UpdateAI(const uint32 diff) { if(isFlameBreathing) { if(!m_creature->IsNonMeleeSpellCasted(false)) { isFlameBreathing = false; }else return; } if(isBombing) { if(BombSequenceTimer < diff) { HandleBombSequence(); }else BombSequenceTimer -= diff; return; } if(!UpdateVictim()) return; //enrage if under 25% hp before 5 min. if(!enraged && m_creature->GetHealth() * 4 < m_creature->GetMaxHealth()) EnrageTimer = 0; if(EnrageTimer < diff) { if(!enraged) { m_creature->CastSpell(m_creature, SPELL_ENRAGE, true); enraged = true; EnrageTimer = 300000; } else { DoScriptText(SAY_BERSERK, m_creature); m_creature->CastSpell(m_creature, SPELL_BERSERK, true); EnrageTimer = 300000; } }else EnrageTimer -= diff; if(BombTimer < diff) { DoScriptText(SAY_FIRE_BOMBS, m_creature); m_creature->AttackStop(); m_creature->GetMotionMaster()->Clear(); DoTeleportTo(JanalainPos[0][0],JanalainPos[0][1],JanalainPos[0][2]); m_creature->StopMoving(); m_creature->CastSpell(m_creature, SPELL_FIRE_BOMB_CHANNEL, false); //DoTeleportPlayer(m_creature, JanalainPos[0][0], JanalainPos[0][1],JanalainPos[0][2], 0); //m_creature->CastSpell(m_creature, SPELL_TELE_TO_CENTER, true); FireWall(); SpawnBombs(); isBombing = true; BombSequenceTimer = 100; //Teleport every Player into the middle Map *map = m_creature->GetMap(); if(!map->IsDungeon()) return; Map::PlayerList const &PlayerList = map->GetPlayers(); for(Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) { if (Player* i_pl = i->getSource()) if(i_pl->isAlive()) DoTeleportPlayer(i_pl, JanalainPos[0][0]-5+rand()%10, JanalainPos[0][1]-5+rand()%10, JanalainPos[0][2], 0); } //m_creature->CastSpell(Temp, SPELL_SUMMON_PLAYERS, true); // core bug, spell does not work if too far return; }else BombTimer -= diff; if(!noeggs) { if(100 * m_creature->GetHealth() < 35 * m_creature->GetMaxHealth()) { DoScriptText(SAY_ALL_EGGS, m_creature); m_creature->AttackStop(); m_creature->GetMotionMaster()->Clear(); DoTeleportTo(JanalainPos[0][0],JanalainPos[0][1],JanalainPos[0][2]); m_creature->StopMoving(); m_creature->CastSpell(m_creature, SPELL_HATCH_ALL, false); HatchAllEggs(2); noeggs = true; } else if(HatcherTimer < diff) { if(HatchAllEggs(0)) { DoScriptText(SAY_SUMMON_HATCHER, m_creature); m_creature->SummonCreature(MOB_AMANI_HATCHER,hatcherway[0][0][0],hatcherway[0][0][1],hatcherway[0][0][2],0,TEMPSUMMON_CORPSE_TIMED_DESPAWN,10000); m_creature->SummonCreature(MOB_AMANI_HATCHER,hatcherway[1][0][0],hatcherway[1][0][1],hatcherway[1][0][2],0,TEMPSUMMON_CORPSE_TIMED_DESPAWN,10000); HatcherTimer = 90000; } else noeggs = true; }else HatcherTimer -= diff; } if(ResetTimer < diff) { float x, y, z, o; m_creature->GetHomePosition(x, y, z, o); if(m_creature->GetPositionZ() <= z-7) { EnterEvadeMode(); return; } ResetTimer = 5000; }else ResetTimer -= diff; DoMeleeAttackIfReady(); if(FireBreathTimer < diff) { if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0)) { m_creature->AttackStop(); m_creature->GetMotionMaster()->Clear(); m_creature->CastSpell(target, SPELL_FLAME_BREATH, false); m_creature->StopMoving(); isFlameBreathing = true; } FireBreathTimer = 8000; }else FireBreathTimer -= diff; }
void UpdateAI(const uint32 diff) { if (Phase == NORMAL) { //Return since we have no target if (!UpdateVictim()) return; if (uiSinsterStrikeTimer <= diff) { DoCast(me->getVictim(), SPELL_SINSTER_STRIKE); uiSinsterStrikeTimer = urand(5 * IN_MILLISECONDS, 9 * IN_MILLISECONDS); } else uiSinsterStrikeTimer -= diff; if (uiCallFlamesTimer <= diff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) { DoCast(target, SPELL_CALL_FLAMES); uiCallFlamesTimer = urand(8 * IN_MILLISECONDS, 12 * IN_MILLISECONDS); } } else uiCallFlamesTimer -= diff; if (!bSacrificed) { if (uiRitualOfSwordTimer <= diff) { if (Unit* pSacrificeTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) { DoScriptText(RAND(SAY_SACRIFICE_PLAYER_1, SAY_SACRIFICE_PLAYER_2, SAY_SACRIFICE_PLAYER_3, SAY_SACRIFICE_PLAYER_4, SAY_SACRIFICE_PLAYER_5), me); DoCast(pSacrificeTarget, SPELL_RITUAL_OF_THE_SWORD); //Spell doesn't teleport DoTeleportPlayer(pSacrificeTarget, 296.632f, -346.075f, 90.63f, 4.6f); me->SetUnitMovementFlags(MOVEMENTFLAG_CAN_FLY); DoTeleportTo(296.632f, -346.075f, 120.85f); Phase = SACRIFICING; if (instance) { instance->SetData64(DATA_SACRIFICED_PLAYER, pSacrificeTarget->GetGUID()); for (uint8 i = 0; i < 3; ++i) if (Creature* summon = me->SummonCreature(CREATURE_RITUAL_CHANNELER, RitualChannelerPos[i], TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 360000)) summon->AI()->DoAction(0); } bSacrificed = true; } } else uiRitualOfSwordTimer -= diff; } DoMeleeAttackIfReady(); } else //SACRIFICING { if (uiSacrificeTimer <= diff) { Unit* pSacrificeTarget = instance ? Unit::GetUnit(*me, instance->GetData64(DATA_SACRIFICED_PLAYER)) : NULL; if (instance && !summons.empty() && pSacrificeTarget && pSacrificeTarget->isAlive()) me->Kill(pSacrificeTarget, false); // durability damage? //go down Phase = NORMAL; pSacrificeTarget = NULL; me->SetUnitMovementFlags(MOVEMENTFLAG_WALKING); if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) me->GetMotionMaster()->MoveChase(target); uiSacrificeTimer = 8 * IN_MILLISECONDS; } else uiSacrificeTimer -= diff; } }