Creature* GetOtherAdd() // For Stalagg returns pFeugen, for Feugen returns pStalagg { switch (m_creature->GetEntry()) { case NPC_FEUGEN: return m_pInstance->GetSingleCreatureFromStorage(NPC_STALAGG); case NPC_STALAGG: return m_pInstance->GetSingleCreatureFromStorage(NPC_FEUGEN); default: return NULL; } }
void Aggro(Unit* /*pWho*/) { if (!m_pInstance) return; m_pInstance->SetData(TYPE_GOTHIK, IN_PROGRESS); // Make immune m_creature->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_ALL, true); m_pInstance->SetGothTriggers(); PrepareSummonPlaces(); }
void Aggro(Unit* pWho) { m_creature->SetInCombatWithZone(); DoScriptText(SAY_SPEECH_1, m_creature); if (!m_pInstance) return; m_pInstance->SetData(TYPE_GOTHIK, IN_PROGRESS); m_pInstance->SetGothTriggers(); }
// Widow's Embrace prevents frenzy and poison bolt, if it removes frenzy, next frenzy is sceduled in 60s // It is likely that this _should_ be handled with some dummy aura(s) - but couldn't find any void SpellHit(Unit* /*pCaster*/, const SpellEntry* pSpellEntry) override { // Check if we hit with Widow's Embrave if (pSpellEntry->Id == SPELL_WIDOWS_EMBRACE || pSpellEntry->Id == SPELL_WIDOWS_EMBRACE_H) { bool bIsFrenzyRemove = false; // If we remove the Frenzy, the Enrage Timer is reseted to 60s if (m_creature->HasAura(m_bIsRegularMode ? SPELL_ENRAGE : SPELL_ENRAGE_H)) { m_uiEnrageTimer = 60000; m_creature->RemoveAurasDueToSpell(m_bIsRegularMode ? SPELL_ENRAGE : SPELL_ENRAGE_H); bIsFrenzyRemove = true; } // Achievement 'Momma said Knock you out': If we removed OR delayed the frenzy, the criteria is failed if ((bIsFrenzyRemove || m_uiEnrageTimer < 30000) && m_pInstance) m_pInstance->SetSpecialAchievementCriteria(TYPE_ACHIEV_KNOCK_YOU_OUT, false); // In any case we prevent Frenzy and Poison Bolt Volley for Widow's Embrace Duration (30s) // We do this be setting the timers to at least bigger than 30s m_uiEnrageTimer = std::max(m_uiEnrageTimer, (uint32)30000); m_uiPoisonBoltVolleyTimer = std::max(m_uiPoisonBoltVolleyTimer, urand(33000, 38000)); } }
void SummonIntroCreatures(uint32 packId) { if (!m_pInstance) return; float fAngle = GetLocationAngle(packId + 1); float fX, fY, fZ; m_pInstance->GetChamberCenterCoords(fX, fY, fZ); fX += M_F_RANGE * cos(fAngle); fY += M_F_RANGE * sin(fAngle); fZ += M_F_HEIGHT; MaNGOS::NormalizeMapCoord(fX); MaNGOS::NormalizeMapCoord(fY); uint32 uiNpcEntry = NPC_SOUL_WEAVER; for (uint8 uiI = 0; uiI < 14; ++uiI) { if (uiI > 0) { if (uiI < 4) uiNpcEntry = NPC_UNSTOPPABLE_ABOM; else uiNpcEntry = NPC_SOLDIER_FROZEN; } float fNewX, fNewY, fNewZ; m_creature->GetRandomPoint(fX, fY, fZ, 12.0f, fNewX, fNewY, fNewZ); m_creature->SummonCreature(uiNpcEntry, fNewX, fNewY, fNewZ, fAngle + M_PI_F, TEMPSPAWN_CORPSE_DESPAWN, 5000); } }
void MoveInLineOfSight(Unit* pWho) override { if (m_pInstance && m_pInstance->GetData(TYPE_KELTHUZAD) != IN_PROGRESS) return; ScriptedAI::MoveInLineOfSight(pWho); }
void SummonAdds(bool bRightSide, uint32 uiSummonEntry) { std::list<Creature*> lSummonList; m_pInstance->GetGothSummonPointCreatures(lSummonList, bRightSide); if (lSummonList.empty()) return; uint8 uiCount = 2; switch(uiSummonEntry) { case NPC_UNREL_TRAINEE: lSummonList.sort(ObjectDistanceOrder(m_creature)); break; case NPC_UNREL_DEATH_KNIGHT: case NPC_UNREL_RIDER: uiCount = 1; lSummonList.sort(ObjectDistanceOrderReversed(m_creature)); break; } for(std::list<Creature*>::iterator itr = lSummonList.begin(); itr != lSummonList.end(); ++itr) { if (uiCount == 0) break; m_creature->SummonCreature(uiSummonEntry, (*itr)->GetPositionX(), (*itr)->GetPositionY(), (*itr)->GetPositionZ(), (*itr)->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); --uiCount; } }
void JustReachedHome() override { if (m_pInstance) { m_pInstance->SetData(TYPE_MAEXXNA, FAIL); } }
void JustReachedHome() override { if (m_pInstance) m_pInstance->SetData(TYPE_GLUTH, FAIL); DoCastSpellIfCan(m_creature, SPELL_DOUBLE_ATTACK, CAST_TRIGGERED | CAST_AURA_NOT_PRESENT); }
void JustDied(Unit* /*pKiller*/) override { DoScriptText(SAY_DEATH, m_creature); if (m_pInstance) m_pInstance->SetData(TYPE_FAERLINA, DONE); }
void JustDied(Unit* /*pKiller*/) { DoScriptText(SAY_DEATH, m_creature); if (m_pInstance) m_pInstance->SetData(TYPE_GOTHIK, DONE); }
void Aggro(Unit* /*pWho*/) override { DoCastSpellIfCan(m_creature, m_bIsRegularMode ? SPELL_FROST_AURA : SPELL_FROST_AURA_H); if (m_pInstance) m_pInstance->SetData(TYPE_SAPPHIRON, IN_PROGRESS); }
void Aggro(Unit* /*pWho*/) override { DoScriptText(urand(0, 1) ? SAY_AGGRO1 : SAY_AGGRO2, m_creature); if (m_pInstance) m_pInstance->SetData(TYPE_PATCHWERK, IN_PROGRESS); }
void JustDied(Unit* /*pKiller*/) override { if (m_pInstance) { m_pInstance->SetData(TYPE_MAEXXNA, DONE); } }
void Aggro(Unit* /*pWho*/) override { if (m_pInstance) { m_pInstance->SetData(TYPE_MAEXXNA, IN_PROGRESS); } }
void JustDied(Unit* /*pKiller*/) override { DoScriptText(SAY_DEATH, m_creature); DespawnAdds(); if (m_pInstance) m_pInstance->SetData(TYPE_KELTHUZAD, DONE); }
void ProcessCentralDoor() { if (IsCentralDoorClosed()) { m_pInstance->SetData(TYPE_GOTHIK, SPECIAL); DoScriptText(EMOTE_GATE, m_creature); } }
void JustReachedHome() override { DespawnIntroCreatures(); DespawnAdds(); if (m_pInstance) m_pInstance->SetData(TYPE_KELTHUZAD, NOT_STARTED); }
bool SetupChain() { // Check, if instance_ script failed or encounter finished if (!m_pInstance || m_pInstance->GetData(TYPE_THADDIUS) == DONE) return true; GameObject* pNoxTeslaFeugen = m_pInstance->GetSingleGameObjectFromStorage(GO_CONS_NOX_TESLA_FEUGEN); GameObject* pNoxTeslaStalagg = m_pInstance->GetSingleGameObjectFromStorage(GO_CONS_NOX_TESLA_STALAGG); // Try again, till Tesla GOs are spawned if (!pNoxTeslaFeugen || !pNoxTeslaStalagg) return false; m_bToFeugen = m_creature->GetDistanceOrder(pNoxTeslaFeugen, pNoxTeslaStalagg); return DoCastSpellIfCan(m_creature, m_bToFeugen ? SPELL_FEUGEN_CHAIN : SPELL_STALAGG_CHAIN) == CAST_OK; }
void Aggro(Unit* /*pWho*/) override { DoScriptText(SAY_AGGRO_1, m_creature); if (m_pInstance) m_pInstance->SetData(TYPE_FAERLINA, IN_PROGRESS); }
void JustDied(Unit* /*pKiller*/) override { DoScriptText(SAY_DEATH, m_creature); DoCastSpellIfCan(m_creature, SPELL_HOPELESS, CAST_TRIGGERED); if (m_pInstance) m_pInstance->SetData(TYPE_RAZUVIOUS, DONE); }
void JustDied(Unit* /*pKiller*/) override { DoScriptText(SAY_DEATH, m_creature); if (m_pInstance) { m_pInstance->SetData(TYPE_THADDIUS, DONE); // Force Despawn of Adds Creature* pFeugen = m_pInstance->GetSingleCreatureFromStorage(NPC_FEUGEN); Creature* pStalagg = m_pInstance->GetSingleCreatureFromStorage(NPC_STALAGG); if (pFeugen) pFeugen->ForcedDespawn(); if (pStalagg) pStalagg->ForcedDespawn(); } }
void JustReachedHome() override { if (m_pInstance) { m_pInstance->SetData(TYPE_THADDIUS, FAIL); // Respawn Adds: Creature* pFeugen = m_pInstance->GetSingleCreatureFromStorage(NPC_FEUGEN); Creature* pStalagg = m_pInstance->GetSingleCreatureFromStorage(NPC_STALAGG); if (pFeugen) { pFeugen->ForcedDespawn(); pFeugen->Respawn(); } if (pStalagg) { pStalagg->ForcedDespawn(); pStalagg->Respawn(); } } }
void Aggro(Unit* /*pWho*/) override { switch (urand(0, 2)) { case 0: DoScriptText(SAY_AGGRO1, m_creature); break; case 1: DoScriptText(SAY_AGGRO2, m_creature); break; case 2: DoScriptText(SAY_AGGRO3, m_creature); break; } if (m_pInstance) m_pInstance->SetData(TYPE_ANUB_REKHAN, IN_PROGRESS); }
void Aggro(Unit* /*pWho*/) override { switch (urand(0, 3)) { case 0: DoScriptText(SAY_AGGRO_1, m_creature); break; case 1: DoScriptText(SAY_AGGRO_2, m_creature); break; case 2: DoScriptText(SAY_AGGRO_3, m_creature); break; case 3: DoScriptText(SAY_AGGRO_4, m_creature); break; } if (m_pInstance) m_pInstance->SetData(TYPE_FAERLINA, IN_PROGRESS); }
void Aggro(Unit* pWho) override { if (!m_pInstance) return; m_pInstance->SetData(TYPE_THADDIUS, IN_PROGRESS); if (Creature* pOtherAdd = GetOtherAdd()) { if (!pOtherAdd->isInCombat()) pOtherAdd->AI()->AttackStart(pWho); } }
bool HasPlayersInLeftSide() const { Map::PlayerList const& lPlayers = m_pInstance->instance->GetPlayers(); if (lPlayers.isEmpty()) return false; for (const auto& lPlayer : lPlayers) { if (Player* pPlayer = lPlayer.getSource()) { if (!m_pInstance->IsInRightSideGothArea(pPlayer) && pPlayer->isAlive()) return true; } } return false; }
bool HasPlayersInLeftSide() { Map::PlayerList const& lPlayers = m_pInstance->instance->GetPlayers(); if (lPlayers.isEmpty()) return false; for (Map::PlayerList::const_iterator itr = lPlayers.begin(); itr != lPlayers.end(); ++itr) { if (Player* pPlayer = itr->getSource()) { if (!m_pInstance->IsInRightSideGothArea(pPlayer) && pPlayer->isAlive()) return true; } } return false; }
void SummonedCreatureJustDied(Creature* pSummoned) override { switch (pSummoned->GetEntry()) { case NPC_GUARDIAN: case NPC_SOLDIER_FROZEN: case NPC_SOUL_WEAVER: m_lAddsSet.erase(pSummoned->GetObjectGuid()); break; case NPC_UNSTOPPABLE_ABOM: m_lAddsSet.erase(pSummoned->GetObjectGuid()); ++m_uiKilledAbomination; if (m_uiKilledAbomination >= ACHIEV_REQ_KILLED_ABOMINATIONS) m_pInstance->SetSpecialAchievementCriteria(TYPE_ACHIEV_GET_ENOUGH, true); break; } }
void PrepareSummonPlaces() { std::list<Creature*> lSummonList; m_pInstance->GetGothSummonPointCreatures(lSummonList, true); if (lSummonList.empty()) return; // Trainees and Rider uint8 index = 0; uint8 uiTraineeCount = 3; lSummonList.sort(ObjectDistanceOrder(m_creature)); for (std::list<Creature*>::iterator itr = lSummonList.begin(); itr != lSummonList.end(); ++itr) { if (*itr) { if (uiTraineeCount == 0) break; if (index == 1) m_lRiderSummonPosGuids.push_back((*itr)->GetObjectGuid()); else { m_lTraineeSummonPosGuids.push_back((*itr)->GetObjectGuid()); --uiTraineeCount; } index++; } } // DeathKnights uint8 uiDeathKnightCount = 2; lSummonList.sort(ObjectDistanceOrderReversed(m_creature)); for (std::list<Creature*>::iterator itr = lSummonList.begin(); itr != lSummonList.end(); ++itr) { if (*itr) { if (uiDeathKnightCount == 0) break; m_lDeathKnightSummonPosGuids.push_back((*itr)->GetObjectGuid()); --uiDeathKnightCount; } } }