void instance_karazhan::SetData(uint32 uiType, uint32 uiData) { switch (uiType) { case TYPE_ATTUMEN: m_auiEncounter[uiType] = uiData; if (uiData == FAIL) { // Respawn Midnight on Fail if (Creature* pMidnight = GetSingleCreatureFromStorage(NPC_MIDNIGHT)) { if (!pMidnight->isAlive()) pMidnight->Respawn(); } } break; case TYPE_MOROES: case TYPE_MAIDEN: m_auiEncounter[uiType] = uiData; break; case TYPE_OPERA: // Don't store the same data twice if (uiData == m_auiEncounter[uiType]) break; m_auiEncounter[uiType] = uiData; if (uiData == IN_PROGRESS) m_uiOzDeathCount = 0; if (uiData == DONE) { DoUseDoorOrButton(GO_STAGE_DOOR_LEFT); DoUseDoorOrButton(GO_STAGE_DOOR_RIGHT); DoToggleGameObjectFlags(GO_SIDE_ENTRANCE_DOOR, GO_FLAG_LOCKED, false); } // use curtain only for event start or fail else DoUseDoorOrButton(GO_STAGE_CURTAIN); break; case TYPE_CURATOR: case TYPE_TERESTIAN: m_auiEncounter[uiType] = uiData; break; case TYPE_ARAN: if (uiData == FAIL || uiData == DONE) DoToggleGameObjectFlags(GO_PRIVATE_LIBRARY_DOOR, GO_FLAG_LOCKED, false); if (uiData == IN_PROGRESS) DoToggleGameObjectFlags(GO_PRIVATE_LIBRARY_DOOR, GO_FLAG_LOCKED, true); m_auiEncounter[uiType] = uiData; break; case TYPE_NETHERSPITE: m_auiEncounter[uiType] = uiData; DoUseDoorOrButton(GO_MASSIVE_DOOR); break; case TYPE_CHESS: if (uiData == DONE) { // doors and loot are not handled for friendly games if (GetData(TYPE_CHESS) != SPECIAL) { DoUseDoorOrButton(GO_GAMESMANS_HALL_EXIT_DOOR); DoRespawnGameObject(GO_DUST_COVERED_CHEST, DAY); DoToggleGameObjectFlags(GO_DUST_COVERED_CHEST, GO_FLAG_NO_INTERACT, false); } // cast game end spells if (Creature* pMedivh = GetSingleCreatureFromStorage(NPC_ECHO_MEDIVH)) { pMedivh->CastSpell(pMedivh, SPELL_FORCE_KILL_BUNNY, TRIGGERED_OLD_TRIGGERED); pMedivh->CastSpell(pMedivh, SPELL_GAME_OVER, TRIGGERED_OLD_TRIGGERED); pMedivh->CastSpell(pMedivh, SPELL_CLEAR_BOARD, TRIGGERED_OLD_TRIGGERED); } if (Creature* pController = GetSingleCreatureFromStorage(NPC_CHESS_VICTORY_CONTROLLER)) pController->CastSpell(pController, SPELL_VICTORY_VISUAL, TRIGGERED_OLD_TRIGGERED); // remove silence debuff Map::PlayerList const& players = instance->GetPlayers(); for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) { if (Player* pPlayer = itr->getSource()) pPlayer->RemoveAurasDueToSpell(SPELL_GAME_IN_SESSION); } m_bFriendlyGame = false; m_uiChessResetTimer = 35000; } else if (uiData == FAIL) { // clean the board for reset if (Creature* pMedivh = GetSingleCreatureFromStorage(NPC_ECHO_MEDIVH)) { pMedivh->CastSpell(pMedivh, SPELL_GAME_OVER, TRIGGERED_OLD_TRIGGERED); pMedivh->CastSpell(pMedivh, SPELL_CLEAR_BOARD, TRIGGERED_OLD_TRIGGERED); } // remove silence debuff Map::PlayerList const& players = instance->GetPlayers(); for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) { if (Player* pPlayer = itr->getSource()) pPlayer->RemoveAurasDueToSpell(SPELL_GAME_IN_SESSION); } m_uiChessResetTimer = 35000; } else if (uiData == IN_PROGRESS || uiData == SPECIAL) DoPrepareChessEvent(); m_auiEncounter[uiType] = uiData; break; case TYPE_MALCHEZZAR: DoUseDoorOrButton(GO_NETHERSPACE_DOOR); m_auiEncounter[uiType] = uiData; break; case TYPE_NIGHTBANE: m_auiEncounter[uiType] = uiData; DoUseDoorOrButton(GO_MASTERS_TERRACE_DOOR_1); DoUseDoorOrButton(GO_MASTERS_TERRACE_DOOR_2); // reset event on timer if (uiData == FAIL) m_uiNightbaneResetTimer = 30000; break; // Store the event type for the Opera case TYPE_OPERA_PERFORMANCE: m_uiOperaEvent = uiData; break; } // Also save the opera performance, once it's set if (uiData == DONE || uiType == TYPE_OPERA_PERFORMANCE) { OUT_SAVE_INST_DATA; std::ostringstream saveStream; saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " " << m_auiEncounter[3] << " " << m_auiEncounter[4] << " " << m_auiEncounter[5] << " " << m_auiEncounter[6] << " " << m_auiEncounter[7] << " " << m_auiEncounter[8] << " " << m_auiEncounter[9] << " " << m_auiEncounter[10] << " " << m_uiOperaEvent; m_strInstData = saveStream.str(); SaveToDB(); OUT_SAVE_INST_DATA_COMPLETE; } }
void instance_karazhan::SetData(uint32 uiType, uint32 uiData) { switch (uiType) { case TYPE_ATTUMEN: m_auiEncounter[uiType] = uiData; if (uiData == FAIL) { // Respawn Midnight on Fail if (Creature* pMidnight = GetSingleCreatureFromStorage(NPC_MIDNIGHT)) { if (!pMidnight->isAlive()) pMidnight->Respawn(); } } break; case TYPE_MOROES: case TYPE_MAIDEN: m_auiEncounter[uiType] = uiData; break; case TYPE_OPERA: // Don't store the same data twice if (uiData == m_auiEncounter[uiType]) break; m_auiEncounter[uiType] = uiData; if (uiData == IN_PROGRESS) m_uiOzDeathCount = 0; if (uiData == FAIL) { DoUseDoorOrButton(GO_STAGE_DOOR_LEFT); } if (uiData == DONE) { DoUseDoorOrButton(GO_STAGE_DOOR_LEFT); DoUseDoorOrButton(GO_STAGE_DOOR_RIGHT); DoToggleGameObjectFlags(GO_SERVANTS_ACCESS_DOOR, GO_FLAG_LOCKED, false); DoToggleGameObjectFlags(GO_SIDE_ENTRANCE_DOOR, GO_FLAG_LOCKED, false); } // use curtain only for event start or fail else DoUseDoorOrButton(GO_STAGE_CURTAIN); break; case TYPE_CURATOR: case TYPE_TERESTIAN: m_auiEncounter[uiType] = uiData; break; case TYPE_ARAN: if (uiData == FAIL || uiData == DONE) DoToggleGameObjectFlags(GO_PRIVATE_LIBRARY_DOOR, GO_FLAG_LOCKED, false); if (uiData == IN_PROGRESS) DoToggleGameObjectFlags(GO_PRIVATE_LIBRARY_DOOR, GO_FLAG_LOCKED, true); m_auiEncounter[uiType] = uiData; break; case TYPE_NETHERSPITE: m_auiEncounter[uiType] = uiData; DoUseDoorOrButton(GO_MASSIVE_DOOR); break; case TYPE_CHESS: if (uiData == DONE) DoFinishChessEvent(); else if (uiData == FAIL) DoFailChessEvent(); else if (uiData == IN_PROGRESS || uiData == SPECIAL) DoPrepareChessEvent(); m_auiEncounter[uiType] = uiData; break; case TYPE_MALCHEZZAR: DoUseDoorOrButton(GO_NETHERSPACE_DOOR); m_auiEncounter[uiType] = uiData; break; case TYPE_NIGHTBANE: m_auiEncounter[uiType] = uiData; DoUseDoorOrButton(GO_MASTERS_TERRACE_DOOR_1); DoUseDoorOrButton(GO_MASTERS_TERRACE_DOOR_2); break; // Store the event type for the Opera case TYPE_OPERA_PERFORMANCE: m_uiOperaEvent = uiData; break; } // Also save the opera performance, once it's set if (uiData == DONE || uiType == TYPE_OPERA_PERFORMANCE) { OUT_SAVE_INST_DATA; std::ostringstream saveStream; saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " " << m_auiEncounter[3] << " " << m_auiEncounter[4] << " " << m_auiEncounter[5] << " " << m_auiEncounter[6] << " " << m_auiEncounter[7] << " " << m_auiEncounter[8] << " " << m_auiEncounter[9] << " " << m_auiEncounter[10] << " " << m_uiOperaEvent; m_strInstData = saveStream.str(); SaveToDB(); OUT_SAVE_INST_DATA_COMPLETE; } }