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); } }
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 OnCreatureCreate(Creature* pCreature) { switch(pCreature->GetEntry()) { case NPC_MARROWGAR: m_uiMarrowgarGUID = pCreature->GetGUID(); if(!pCreature->isAlive()) SetData(TYPE_MARROWGAR,DONE); break; case NPC_DEATHWHISPER: m_uiDeathwhisperGUID = pCreature->GetGUID(); if(!pCreature->isAlive()) SetData(TYPE_DEATHWHISPER,DONE); break; case NPC_SAURFANG: m_uiSaurfangGUID = pCreature->GetGUID(); if(!pCreature->isAlive()) { m_auiEncounter[TYPE_SAURFANG] = DONE; OpenDoor(m_uiSaurfangDoorGUID); } break; case NPC_FESTERGUT: if(isHeroic()) AutoFreeze(pCreature); m_uiFestergutGUID = pCreature->GetGUID(); if(!pCreature->isAlive()) SetData(TYPE_FESTERGUT,DONE); break; case NPC_ROTFACE: if(isHeroic()) AutoFreeze(pCreature); m_uiRotfaceGUID = pCreature->GetGUID(); if(!pCreature->isAlive()) SetData(TYPE_ROTFACE,DONE); break; case NPC_PUTRICIDE: m_uiPutricideGUID = pCreature->GetGUID(); if(!pCreature->isAlive()) SetData(TYPE_PUTRICIDE,DONE); AutoFreeze(pCreature); if(isHeroic()) AutoFreeze(pCreature); break; case NPC_PRINCE_KELESETH: m_uiPrinceKelesethGUID = pCreature->GetGUID(); if(isHeroic()) AutoFreeze(pCreature); break; case NPC_PRINCE_VALANAR: m_uiPrinceValanarGUID = pCreature->GetGUID(); if(isHeroic()) AutoFreeze(pCreature); if(!pCreature->isAlive()) SetData(TYPE_PRINCE_COUNCIL,DONE); break; case NPC_PRINCE_TALDARAM: m_uiPrinceTaldaramGUID = pCreature->GetGUID(); if(isHeroic()) AutoFreeze(pCreature); break; case NPC_LANATHEL: m_uiLanathelGUID = pCreature->GetGUID(); if(isHeroic()) AutoFreeze(pCreature); if(!pCreature->isAlive()) SetData(TYPE_LANATHEL,DONE); break; case NPC_DREAMWALKER: m_uiDreamWalkerGUID = pCreature->GetGUID(); if(isHeroic()) AutoFreeze(pCreature); if(GetData(TYPE_DREAMWALKER) == DONE) pCreature->ForcedDespawn(100); break; case NPC_SINDRAGOSA: m_uiSindragosaGUID = pCreature->GetGUID(); if(isHeroic()) AutoFreeze(pCreature); if(!pCreature->isAlive()) SetData(TYPE_SINDRAGOSA,DONE); break; case NPC_LICHKING: m_uiLichKingGUID = pCreature->GetGUID(); if(isHeroic()) AutoFreeze(pCreature); break; case 37006: rotfacePoolsGUIDs.push_back(pCreature->GetGUID()); break; case 38422: case 38458: case 38454: case 38369: vortexGUIDs.push_back(pCreature->GetGUID()); break; case 38186: case 38068: case 37934: case 37907: case 37886: case 37863: case 36791: dreamwalkerAddsGUIDs.push_back(pCreature->GetGUID()); break; case 37868: if(pCreature->GetDBTableGUIDLow() == 0) dreamwalkerAddsGUIDs.push_back(pCreature->GetGUID()); else { if(GetData(TYPE_DREAMWALKER) == DONE) pCreature->ForcedDespawn(100); dreamwalkerEventAddGUIDs.push_back(pCreature->GetGUID()); } break; case NPC_DREAMWALKER_IMAGE: pCreature->SetPhaseMask(16,true); m_uiDreamwalkerImageGUID = pCreature->GetGUID(); break; case NPC_TIRION_FORDRING: m_uiFordringLKEventGUID = pCreature->GetGUID(); break; } }