void instance_uldaman::SetData(uint32 uiType, uint32 uiData) { switch (uiType) { case TYPE_ALTAR_EVENT: if (uiData == DONE) { DoUseDoorOrButton(GO_TEMPLE_DOOR_UPPER); DoUseDoorOrButton(GO_TEMPLE_DOOR_LOWER); } else if (uiData == IN_PROGRESS) { // Also do a reset before starting the event - this will respawn dead Keepers DoResetKeeperEvent(); m_uiKeeperCooldown = 5000; } else if (uiData == NOT_STARTED) { DoResetKeeperEvent(); m_uiStoneKeepersFallen = 0; } m_auiEncounter[0] = uiData; break; case TYPE_ARCHAEDAS: if (uiData == DONE) { DoUseDoorOrButton(GO_ANCIENT_VAULT); DoRespawnGameObject(GO_ANCIENT_TREASURE, HOUR); } m_auiEncounter[1] = uiData; break; } if (uiData == DONE) { OUT_SAVE_INST_DATA; std::ostringstream saveStream; saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1]; m_strInstData = saveStream.str(); SaveToDB(); OUT_SAVE_INST_DATA_COMPLETE; } }
void instance_uldaman::Update(uint32 uiDiff) { if (m_auiEncounter[0] == IN_PROGRESS) { if (m_uiKeeperCooldown >= uiDiff) m_uiKeeperCooldown -= uiDiff; else { m_uiKeeperCooldown = 5000; if (!m_mKeeperMap.empty()) { for (std::map<ObjectGuid, bool>::iterator itr = m_mKeeperMap.begin(); itr != m_mKeeperMap.end(); ++itr) { // died earlier if (!itr->second) continue; if (Creature* pKeeper = instance->GetCreature(itr->first)) { if (pKeeper->isAlive() && !pKeeper->getVictim()) { if (Player* pPlayer = pKeeper->GetMap()->GetPlayer(m_playerGuid)) { // we should use group instead, event starter can be dead while group is still fighting if (pPlayer->isAlive() && !pPlayer->isInCombat()) { pKeeper->RemoveAurasDueToSpell(SPELL_STONED); pKeeper->SetInCombatWith(pPlayer); pKeeper->AddThreat(pPlayer); } else { if (!pPlayer->isAlive()) DoResetKeeperEvent(); } } break; } else if (!pKeeper->isAlive()) { itr->second = pKeeper->isAlive(); ++m_uiStoneKeepersFallen; } } } if (m_uiStoneKeepersFallen == m_mKeeperMap.size()) SetData(TYPE_ALTAR_EVENT, DONE); } } } }