void Reset() { // Remove immunity m_creature->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_ALL, false); m_uiPhase = PHASE_SPEECH; m_uiSpeech = 1; m_uiTraineeTimer = 24 * IN_MILLISECONDS; m_uiDeathKnightTimer = 74 * IN_MILLISECONDS; m_uiRiderTimer = 134 * IN_MILLISECONDS; m_uiTeleportTimer = urand(30000, 45000); // Teleport every 30-45 seconds. m_uiShadowboltTimer = 2 * IN_MILLISECONDS; m_uiHarvestSoulTimer = 2500; m_uiPhaseTimer = 3 * MINUTE * IN_MILLISECONDS + 44 * IN_MILLISECONDS; // last summon at 3:44 - Teleport down at 4:34 m_uiControlZoneTimer = urand(120 * IN_MILLISECONDS, 150 * IN_MILLISECONDS); m_uiSpeechTimer = 1 * IN_MILLISECONDS; // Despawn Adds for (GUIDList::const_iterator itr = m_lSummonedAddGuids.begin(); itr != m_lSummonedAddGuids.end(); itr++) { if (Creature* pCreature = m_creature->GetMap()->GetCreature(*itr)) pCreature->ForcedDespawn(); } m_lSummonedAddGuids.clear(); m_lTraineeSummonPosGuids.clear(); m_lDeathKnightSummonPosGuids.clear(); m_lRiderSummonPosGuids.clear(); }
// Unsummon Majordomo adds void UnsummonMajordomoAdds() { for (GUIDList::const_iterator itr = m_luiMajordomoAddsGUIDs.begin(); itr != m_luiMajordomoAddsGUIDs.end(); ++itr) { if (Creature* pAdd = m_creature->GetMap()->GetCreature(*itr)) if (pAdd->IsTemporarySummon()) ((TemporarySummon*)pAdd)->UnSummon(); } m_luiMajordomoAddsGUIDs.clear(); }
void DespawnOrKillAdds(bool bDespawn) { for (GUIDList::const_iterator itr = m_lSummonedAddGuids.begin(); itr != m_lSummonedAddGuids.end(); ++itr) { if (Creature* pAdd = m_creature->GetMap()->GetCreature(*itr)) { if (bDespawn) pAdd->ForcedDespawn(); else { pAdd->SetDeathState(JUST_DIED); pAdd->SetHealth(0); } } } m_lSummonedAddGuids.clear(); }
void JustDied(Unit* pKiller) { DoScriptText(SAY_DEATH, m_creature); if (m_pInstance) { m_pInstance->SetData(TYPE_TRIBUNAL, FAIL); // Continue at right state after respawn if (m_bHasContinued) m_pInstance->SetData(TYPE_TRIBUNAL, IN_PROGRESS); } for (GUIDList::const_iterator itr = m_luiDwarfGUIDs.begin(); itr != m_luiDwarfGUIDs.end(); ++itr) { if (Creature* pDwarf = m_creature->GetMap()->GetCreature(*itr)) pDwarf->ForcedDespawn(); } m_luiDwarfGUIDs.clear(); }
void UpdateAI(const uint32 uiDiff) { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim() || m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == POINT_MOTION_TYPE) return; if (m_uiMark_Count >= 100) if (m_uiEnrage_Timer < uiDiff) { m_creature->InterruptNonMeleeSpells(false); DoCast(m_creature, SPELL_BERSERK, true); m_uiEnrage_Timer = 300000; } else m_uiEnrage_Timer -= uiDiff; // Mark of Blaumeux if (m_uiMark_Timer < uiDiff) { DoCastSpellIfCan(m_creature,SPELL_MARK_OF_BLAUMEUX,CAST_TRIGGERED); m_uiMark_Timer = 15000; m_uiMark_Count++; } else m_uiMark_Timer -= uiDiff; // Shield Wall - All 4 horsemen will shield wall at 50% hp and 20% hp for 20 seconds if (m_bShieldWall1 && m_creature->GetHealthPercent() < 50.0f) { if (m_bShieldWall1) { DoCastSpellIfCan(m_creature,SPELL_SHIELDWALL); m_bShieldWall1 = false; } } else if (m_bShieldWall2 && m_creature->GetHealthPercent() < 20.0f) { if (m_bShieldWall2) { DoCastSpellIfCan(m_creature,SPELL_SHIELDWALL); m_bShieldWall2 = false; } } // Void Zone if (m_uiVoidZone_Timer < uiDiff) { // get random player in 45yard range (maybe this can be done easier?) ThreatList const& tList = m_creature->getThreatManager().getThreatList(); if(!tList.empty()) { GUIDList lClosePlayerList; lClosePlayerList.clear(); for (ThreatList::const_iterator itr = tList.begin();itr != tList.end(); ++itr) if(Unit* pUnit = m_creature->GetMap()->GetUnit((*itr)->getUnitGuid())) if (m_creature->GetDistance2d(pUnit) < 45.f) lClosePlayerList.push_back(pUnit->GetGUID()); if(!lClosePlayerList.empty()) { GUIDList::iterator i = lClosePlayerList.begin(); advance(i, (rand() % lClosePlayerList.size())); if(Player* pTarget = m_creature->GetMap()->GetPlayer(*i)) DoCastSpellIfCan(pTarget, m_bIsRegularMode ? SPELL_VOIDZONE : H_SPELL_VOIDZONE, CAST_TRIGGERED); } } m_uiVoidZone_Timer = 12000; } else m_uiVoidZone_Timer -= uiDiff; if (m_uiShadowBolt_Timer < uiDiff) { // cast on closest player ThreatList const& tList = m_creature->getThreatManager().getThreatList(); if (!tList.empty()) { Unit* pTarget = m_creature->GetMap()->GetUnit((*tList.begin())->getUnitGuid()); for (ThreatList::const_iterator itr = tList.begin();itr != tList.end(); ++itr) if (Unit* pUnit = m_creature->GetMap()->GetUnit((*itr)->getUnitGuid())) if (pTarget && m_creature->GetDistance2d(pUnit) < m_creature->GetDistance2d(pTarget)) pTarget = pUnit; if (pTarget && m_creature->GetDistance2d(pTarget)< 45.0f) DoCast(pTarget, m_bIsRegularMode ? SPELL_SHADOW_BOLT : H_SPELL_SHADOW_BOLT, true); else DoCast(m_creature, SPELL_UNYIELDING_PAIN, true); } m_uiShadowBolt_Timer = 2000; } else m_uiShadowBolt_Timer -= uiDiff; DoMeleeAttackIfReady(); }