void UpdateAI(const uint32 diff) { if(!pInstance) return; if (!pet) { if (Creature* pGuard = m_creature->GetMap()->GetCreature(pInstance->GetData64(NPC_PRECIOUS))) if (!pGuard->isAlive()) { pet = true; if (pInstance->GetData(TYPE_PRECIOUS) == NOT_STARTED) { DoScriptText(-1631228,m_creature); pInstance->SetData(TYPE_PRECIOUS,DONE); } } } if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; if (nexttick) { doCast(SPELL_OOZE_FLOOD_1); DoScriptText(-1631227,m_creature); nexttick = false; }; if (timedQuery(SPELL_OOZE_FLOOD_1, diff)) { uint8 i = urand(0,3); if (Unit* pTemp = doSummon(NPC_OOZE_STALKER,SpawnLoc[i].x, SpawnLoc[i].y, SpawnLoc[i].z, TEMPSUMMON_TIMED_DESPAWN, 15000)) { doCast(SPELL_OOZE_FLOOD, pTemp); nexttick = true; } }; if (timedQuery(SPELL_SLIME_SPRAY, diff)) if (doSummon(NPC_OOZE_SPRAY_STALKER)) doCast(SPELL_SLIME_SPRAY); if (timedQuery(SPELL_MUTATED_INFECTION, diff)) { for(uint8 i = 0; i < getSpellData(SPELL_MUTATED_INFECTION); ++i) if (Unit* pTarget = doSelectRandomPlayer(SPELL_MUTATED_INFECTION_AURA, false, 60.0f)) doCast(SPELL_MUTATED_INFECTION, pTarget); DoScriptText(-1631226,m_creature); } if (timedQuery(SPELL_BERSERK, diff)) { doCast(SPELL_BERSERK); DoScriptText(-1631225,m_creature); }; DoMeleeAttackIfReady(); }
void CallOoze() { if (doCast(SPELL_UNSTABLE_EXPERIMENT) == CAST_OK) switch(slimetype) { case 0: doSummon(NPC_VOLATILE_OOZE); slimetype = 1; break; case 1: doSummon(NPC_GAS_CLOUD); slimetype = 0; break; default: break; } }
void doSummonSpike(Unit* pTarget) { if (!pTarget || !pTarget->isAlive()) return; float fPosX, fPosY, fPosZ; pTarget->GetPosition(fPosX, fPosY, fPosZ); if (Unit* pSpike = doSummon(NPC_BONE_SPIKE, fPosX, fPosY, fPosZ + 0.5f)) { pSpike->SetOwnerGuid(m_creature->GetObjectGuid()); pSpike->SetInCombatWith(pTarget); pSpike->AddThreat(pTarget, 1000.0f); } }
void doMeteorStrike() { if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 1)) { if (doCast(SPELL_METEOR, pTarget) == CAST_OK) { DoScriptText(-1666106,m_creature,pTarget); float fPosX, fPosY, fPosZ; m_creature->GetPosition(fPosX, fPosY, fPosZ); pInstance->SetData(DATA_X, fPosX); pInstance->SetData(DATA_Y, fPosY); pInstance->SetData(DATA_Z, fPosZ); if (Unit* pMeteor = doSummon(NPC_METEOR_STRIKE, fPosX, fPosY, fPosZ)) pMeteor->AddThreat(pTarget, 100.0f); }; } }
void UpdateAI(const uint32 diff) { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; switch(getStage()) { case 0: if (timedQuery(SPELL_BONE_STRIKE, diff)) if (Unit* pTarget = doSelectRandomPlayer(SPELL_BONE_STRIKE_IMPALE, false, 60.0f)) if (doCast(SPELL_BONE_STRIKE, pTarget) == CAST_OK) { doSummonSpike(pTarget); switch (urand(0,1)) { case 0: DoScriptText(-1631003,m_creature,pTarget); break; case 1: DoScriptText(-1631004,m_creature,pTarget); break; case 2: DoScriptText(-1631005,m_creature,pTarget); break; }; }; if (timedQuery(SPELL_BONE_STORM, diff)) setStage(1); if (timedQuery(SPELL_CALL_COLD_FLAME, diff)) { if (urand(0,1)) doCast(SPELL_CALL_COLD_FLAME); else doCast(SPELL_CALL_COLD_FLAME_1); if (m_creature->GetHealthPercent() <= 30.0f) { if (urand(0,1)) doCast(SPELL_CALL_COLD_FLAME); else doCast(SPELL_CALL_COLD_FLAME_1); } } timedCast(SPELL_SABER_LASH, diff); DoMeleeAttackIfReady(); break; case 1: m_creature->InterruptNonMeleeSpells(true); doCast(SPELL_BONE_STORM); setStage(2); DoScriptText(-1631002,m_creature); DoResetThreat(); m_creature->RemoveSplineFlag(SPLINEFLAG_WALKMODE); m_creature->SetSpeedRate(MOVE_RUN, 3); m_creature->SetSpeedRate(MOVE_WALK, 3); break; case 2: if (!m_creature->IsNonMeleeSpellCasted(false)) setStage(3); break; case 3: if (isHeroic()) if (timedQuery(SPELL_BONE_STRIKE, diff, true)) if (Unit* pTarget = doSelectRandomPlayer(SPELL_BONE_STRIKE_IMPALE, false, 60.0f)) doSummonSpike(pTarget); if (timedQuery(SPELL_CALL_COLD_FLAME, diff, true) && m_creature->IsWithinDistInMap(m_creature->getVictim(),2.0f)) { pInstance->SetData(DATA_DIRECTION, (uint32)(1000*2.0f*M_PI_F*((float)urand(1,16)/16.0f))); // if (urand(0,1)) doCast(SPELL_CALL_COLD_FLAME); // else doCast(SPELL_CALL_COLD_FLAME_1); float fPosX, fPosY, fPosZ; m_creature->GetPosition(fPosX, fPosY, fPosZ); doSummon(NPC_COLD_FLAME, fPosX, fPosY, fPosZ); DoResetThreat(); if (Unit* pTarget = doSelectRandomPlayerAtRange(60.0f)) AttackStart(pTarget); } if (!hasAura(SPELL_BONE_STORM_STRIKE, m_creature) && !hasAura(SPELL_BONE_STORM, m_creature)) setStage(4); break; case 4: pInstance->SetData(DATA_DIRECTION, 0); m_creature->SetSpeedRate(MOVE_RUN, 1); m_creature->SetSpeedRate(MOVE_WALK, 1); // m_creature->AddSplineFlag(SPLINEFLAG_WALKMODE); setStage(0); break; default: break; } if (timedQuery(SPELL_BERSERK, diff)) { doCast(SPELL_BERSERK); DoScriptText(-1631008,m_creature); } }
void UpdateAI(const uint32 diff) { if(!pInstance) return; if (!pet) { if (Creature* pGuard = pInstance->GetSingleCreatureFromStorage(NPC_STINKY)) if (!pGuard->isAlive()) { pet = true; if (pInstance->GetData(TYPE_STINKY) == NOT_STARTED) { DoScriptText(-1631209,m_creature); pInstance->SetData(TYPE_STINKY,DONE); } } } if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; Creature* pBlightTarget = m_creature->GetMap()->GetCreature(blightTargetGUID); switch(getStage()) { case 0: if (timedQuery(SPELL_GASEOUS_BLIGHT_2, diff)) setStage(1); break; case 1: switch (urand(0,2)) { case 0: DoScriptText(-1631210,m_creature); break; case 1: DoScriptText(-1631211,m_creature); break; case 2: DoScriptText(-1631212,m_creature); break; } doCast(SPELL_INHALE_BLIGHT); setStage(2); break; case 2: if (m_creature->IsNonMeleeSpellCasted(false)) return; if (pBlightTarget) { doRemove(SPELL_GASEOUS_BLIGHT_1); doRemove(SPELL_BLIGHT_VISUAL_1,pBlightTarget); doRemove(SPELL_BLIGHT_VISUAL_1,m_creature); doCast(SPELL_GASEOUS_BLIGHT_2); doRemoveFromAll(SPELL_BLIGHT_VISUAL_3); doRemoveFromAll(SPELL_BLIGHT_VISUAL_2); doRemoveFromAll(SPELL_BLIGHT_VISUAL_1); } setStage(3); break; case 3: if (timedQuery(SPELL_GASEOUS_BLIGHT_3, diff)) setStage(4); break; case 4: switch (urand(0,2)) { case 0: DoScriptText(-1631210,m_creature); break; case 1: DoScriptText(-1631211,m_creature); break; case 2: DoScriptText(-1631212,m_creature); break; } doCast(SPELL_INHALE_BLIGHT); setStage(5); break; case 5: if (m_creature->IsNonMeleeSpellCasted(false)) return; if (pBlightTarget) { doRemove(SPELL_GASEOUS_BLIGHT_2); doRemove(SPELL_BLIGHT_VISUAL_2,pBlightTarget); doRemove(SPELL_BLIGHT_VISUAL_2,m_creature); doCast(SPELL_GASEOUS_BLIGHT_3); doRemoveFromAll(SPELL_BLIGHT_VISUAL_3); doRemoveFromAll(SPELL_BLIGHT_VISUAL_2); doRemoveFromAll(SPELL_BLIGHT_VISUAL_1); } setStage(6); break; case 6: if (timedQuery(SPELL_GASEOUS_BLIGHT_3, diff)) setStage(7); break; case 7: switch (urand(0,2)) { case 0: DoScriptText(-1631210,m_creature); break; case 1: DoScriptText(-1631211,m_creature); break; case 2: DoScriptText(-1631212,m_creature); break; } doCast(SPELL_INHALE_BLIGHT); setStage(8); break; case 8: if (m_creature->IsNonMeleeSpellCasted(false)) return; if (pBlightTarget) { doRemove(SPELL_GASEOUS_BLIGHT_3); doRemove(SPELL_BLIGHT_VISUAL_3,pBlightTarget); doRemove(SPELL_BLIGHT_VISUAL_3,m_creature); doRemoveFromAll(SPELL_BLIGHT_VISUAL_3); doRemoveFromAll(SPELL_BLIGHT_VISUAL_2); doRemoveFromAll(SPELL_BLIGHT_VISUAL_1); } setStage(9); break; case 9: if (timedQuery(SPELL_PUNGENT_BLIGHT, diff)) { DoScriptText(-1631208,m_creature); doCast(SPELL_PUNGENT_BLIGHT); setStage(10); } break; case 10: if (m_creature->IsNonMeleeSpellCasted(false)) return; if (pBlightTarget) { doCast(SPELL_BLIGHT_VISUAL_1,pBlightTarget); doRemoveFromAll(SPELL_BLIGHT_VISUAL_3); doRemoveFromAll(SPELL_BLIGHT_VISUAL_2); doRemoveFromAll(SPELL_BLIGHT_VISUAL_1); } m_creature->RemoveAurasDueToSpell(SPELL_INHALED_BLIGHT); setStage(0); break; } timedCast(SPELL_GAS_SPORE, diff); timedCast(SPELL_GASTRIC_BLOAT, diff); if (timedQuery(SPELL_VILE_GAS, diff)) { float fPosX, fPosY, fPosZ; m_creature->GetPosition(fPosX, fPosY, fPosZ); m_creature->GetRandomPoint(fPosX, fPosY, fPosZ, 30.0f, fPosX, fPosY, fPosZ); if (Unit* pTemp = doSummon(NPC_VILE_GAS_STALKER,fPosX, fPosY, fPosZ)) doCast(SPELL_VILE_GAS, pTemp); DoScriptText(-1631213,m_creature); }; if (timedQuery(SPELL_BERSERK, diff)) { doCast(SPELL_BERSERK); DoScriptText(-1631207,m_creature); }; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 uiDiff) { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; switch(stage) { case 0: { timedCast(SPELL_POUND, uiDiff); timedCast(SPELL_COLD, uiDiff); if (timedQuery(SUMMON_BORROWER, uiDiff)) { doCast(SUMMON_BORROWER); DoScriptText(-1713556,m_creature); }; if (timedQuery(SPELL_SUBMERGE_0, uiDiff)) stage = 1; break;} case 1: { doCast(SPELL_SUBMERGE_0); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); stage = 2; DoScriptText(-1713557,m_creature); break;} case 2: { if (timedQuery(SPELL_SPIKE_CALL, uiDiff)) { pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,0); // doCast(SPELL_SPIKE_CALL); // This summon not supported in database. Temporary override. Unit* spike = doSummon(NPC_SPIKE,TEMPSUMMON_TIMED_DESPAWN,60000); if (spike) { spike->AddThreat(pTarget, 1000.0f); DoScriptText(-1713558,m_creature,pTarget); doCast(SPELL_MARK,pTarget); spike->GetMotionMaster()->MoveChase(pTarget); } }; if (timedQuery(SPELL_SUMMON_BEATLES, uiDiff)) { doCast(SPELL_SUMMON_BEATLES); doCast(SUMMON_SCARAB); DoScriptText(-1713560,m_creature); }; if (timedQuery(SPELL_SUBMERGE_0, uiDiff)) stage = 3; break;} case 3: { stage = 0; DoScriptText(-1713559,m_creature); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); doRemove(SPELL_SUBMERGE_0,m_creature); break;} case 4: { doCast(SPELL_LEECHING_SWARM); DoScriptText(-1713561,m_creature); stage = 5; break;} case 5: { timedCast(SPELL_POUND, uiDiff); timedCast(SPELL_COLD, uiDiff); break;} } timedCast(SUMMON_FROSTSPHERE, uiDiff); timedCast(SPELL_BERSERK, uiDiff); if (m_creature->GetHealthPercent() < 30.0f && stage == 0) stage = 4; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 uiDiff) { if (!pInstance) return; if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; if (m_creature->GetHealth() > pInstance->GetData(DATA_HEALTH_HALION_T) && pInstance->GetData(DATA_HEALTH_HALION_T) != 0) m_creature->SetHealth(pInstance->GetData(DATA_HEALTH_HALION_T)); if (m_creature->GetHealthPercent() < 100.0f && p_phase == 0) { pInstance->SetData(TYPE_HALION_LOCK, DONE); p_phase = 1; } if (m_creature->GetHealthPercent() < 75.0f && p_phase == 1) { DoScriptText(-1666108,m_creature); p_phase = 2; } if (m_creature->GetHealthPercent() < 50.0f && p_phase == 2) { DoScriptText(-1666109,m_creature); p_phase = 3; } switch (p_phase) { case 0: //SPAWNED break; case 1: //PHASE 1 PHYSICAL REALM timedCast(SPELL_FLAME_BREATH_0, uiDiff); timedCast(SPELL_FIERY_COMBUSTION, uiDiff); /* Meteor Needs Test */ if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 1)) { if (doCast(SPELL_METEOR, pTarget) == CAST_OK) { DoScriptText(-1666106,m_creature,pTarget); float fPosX, fPosY, fPosZ; m_creature->GetPosition(fPosX, fPosY, fPosZ); if (Unit* pMeteor = doSummon(NPC_METEOR_STRIKE, fPosX, fPosY, fPosZ)) pMeteor->AddThreat(pTarget, 100.0f); }; } break; case 2: //DEPHASE HALION FORCE TO TWILIGHT REALM //setflag unattackable, unselectable, remove combat break; case 3: //PHASE 3 BOTH REALMS timedCast(SPELL_FLAME_BREATH_0, uiDiff); timedCast(SPELL_FIERY_COMBUSTION, uiDiff); doCast(SPELL_TWILIGHT_DIVISION); /* Needs Script timedCast(SPELL_METEOR_STRIKE, uiDiff); timedCast(SPELL_CORPREALITY_EVEN, uiDiff); */ break; default: break; } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; switch(stage) { case 0: if (timedQuery(SPELL_CORRUPT_SOUL, diff)) { if (Unit* pTarget= m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) { if (doCast(SPELL_CORRUPT_SOUL, pTarget) == CAST_OK) { DoScriptText(-1632006,m_creature,pTarget); float fPosX, fPosY, fPosZ; pTarget->GetPosition(fPosX, fPosY, fPosZ); doSummon(NPC_SOUL_FRAGMENT,fPosX, fPosY, fPosZ); } } } break; case 1: if (timedCast(SPELL_TELEPORT, diff) == CAST_OK) stage = 2; break; case 2: if (timedCast(SPELL_SOULSTORM, diff) == CAST_OK) { DoScriptText(-1632005,m_creature); SetCombatMovement(false); stage = 3; } break; case 3: timedCast(SPELL_FEAR, diff); break; } timedCast(SPELL_SHADOW_BOLT, diff); timedCast(SPELL_MAGIC_BANE, diff); if (m_creature->GetHealthPercent() <= 30.0f && stage == 0) stage = 1; DoMeleeAttackIfReady(); if (BattleMusicTimer < diff && m_creature->isAlive()) { switch(Music) { case 0: m_creature->PlayDirectSound(Battle01); BattleMusicTimer = 49000; break; case 1: m_creature->PlayDirectSound(Battle02); BattleMusicTimer = 28000; break; case 2: m_creature->PlayDirectSound(Battle03); BattleMusicTimer = 37000; break; } } else BattleMusicTimer -= diff; }
void UpdateAI(const uint32 diff) { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; switch(getStage()) { case 0: // Bone Slice and single Coldflames phase { if (timedQuery(SPELL_BONE_SPIKE, diff)) { if (Unit* pTarget = doSelectRandomPlayer(SPELL_BONE_SPIKE_IMPALE, false, 60.0f, isHeroic())) { doCast(pTarget, SPELL_BONE_SPIKE); DoSummonSpike(pTarget); DoScriptText(-1631003 - urand(0,2), m_creature, pTarget); } } if (timedQuery(SPELL_BONE_STORM, diff)) setStage(1); if (timedQuery(SPELL_CALL_COLD_FLAME, diff)) doCast(SPELL_CALL_COLD_FLAME); if (m_uiSliceTimer <= 1000) { if (m_uiSliceTimer <= diff) { doCast(SPELL_BONE_SLICE, m_creature->getVictim()); m_uiSliceTimer = 1000; } else m_uiSliceTimer -= diff; } else m_uiSliceTimer -= diff; DoMeleeAttackIfReady(); break; } case 1: // Bone Storm initialization phase { m_creature->InterruptNonMeleeSpells(true); doCast(SPELL_BONE_STORM); DoScriptText(-1631002,m_creature); SetCombatMovement(false); m_creature->GetMotionMaster()->Clear(); m_creature->SetSpeedRate(MOVE_RUN, 3); // initial X Coldflames are in Marrowgar's place m_creature->GetPosition(targetPosX, targetPosY, targetPosZ); setStage(2); break; } case 2: // Bone Storm waiting to end casting the spell { if (!m_creature->IsNonMeleeSpellCasted(false)) setStage(3); break; } case 3: // Whirling in Bone Storm and casting Cold Flames { if (isHeroic()) { if (timedQuery(SPELL_BONE_SPIKE, diff)) { if (Unit* pTarget = doSelectRandomPlayer(SPELL_BONE_SPIKE_IMPALE, false, 60.0f, isHeroic())) { doCast(pTarget, SPELL_BONE_SPIKE); DoSummonSpike(pTarget); DoScriptText(-1631003 - urand(0,2), m_creature, pTarget); } } } if (m_creature->GetDistance2d(targetPosX, targetPosY) < 5.0f) { if (!m_bIsColdFlameXCast) { float myPosX, myPosY, myPosZ; m_creature->GetPosition(myPosX, myPosY, myPosZ); m_pInstance->SetData(DATA_DIRECTION, (uint32)(1000*2.0f*M_PI_F*((float)urand(1,16)/16.0f))); doCast(SPELL_CALL_COLD_FLAME); doSummon(NPC_COLD_FLAME, myPosX, myPosY, myPosZ); if (++m_uiColdFlameCounter >= 4 + isHeroic()) { doRemove(SPELL_BONE_STORM_STRIKE); doRemove(SPELL_BONE_STORM); } m_bIsColdFlameXCast = true; } if (m_uiBoneStormChargeTimer <= diff) { if (Unit* pTarget = doSelectRandomPlayerAtRange(60.0f)) { pTarget->GetPosition(targetPosX, targetPosY, targetPosZ); m_creature->GetMotionMaster()->MovePoint(0, targetPosX, targetPosY, targetPosZ); m_bIsColdFlameXCast = false; m_uiBoneStormChargeTimer = 3000; } } else m_uiBoneStormChargeTimer -= diff; } if (!hasAura(SPELL_BONE_STORM_STRIKE, m_creature) && !hasAura(SPELL_BONE_STORM, m_creature)) setStage(4); break; } case 4: { m_pInstance->SetData(DATA_DIRECTION, 0); m_creature->SetSpeedRate(MOVE_RUN, 1); m_uiColdFlameCounter = 0; SetCombatMovement(true); m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); m_uiSliceTimer = 10000; setStage(0); break; } default: break; } if (timedQuery(SPELL_BERSERK, diff)) { doCast(SPELL_BERSERK); DoScriptText(-1631008, m_creature); } }