void instance_shattered_halls::Update(uint32 uiDiff) { if (m_auiEncounter[TYPE_EXECUTION] != IN_PROGRESS) return; if (m_uiExecutionTimer < uiDiff) { switch (m_uiExecutionStage) { case 0: // Kill the officer if (Creature* pSoldier = GetSingleCreatureFromStorage(m_uiTeam == ALLIANCE ? NPC_OFFICER_ALLIANCE : NPC_OFFICER_HORDE)) pSoldier->DealDamage(pSoldier, pSoldier->GetHealth(), nullptr, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, nullptr, false); // Make Kargath yell DoOrSimulateScriptTextForThisInstance(m_uiTeam == ALLIANCE ? SAY_KARGATH_EXECUTE_ALLY : SAY_KARGATH_EXECUTE_HORDE, NPC_KARGATH_BLADEFIST); // Set timer for the next execution DoCastGroupDebuff(SPELL_KARGATH_EXECUTIONER_2); m_uiExecutionTimer = 10 * MINUTE * IN_MILLISECONDS; break; case 1: if (Creature* pSoldier = GetSingleCreatureFromStorage(m_uiTeam == ALLIANCE ? NPC_SOLDIER_ALLIANCE_2 : NPC_SOLDIER_HORDE_2)) pSoldier->DealDamage(pSoldier, pSoldier->GetHealth(), nullptr, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, nullptr, false); DoCastGroupDebuff(SPELL_KARGATH_EXECUTIONER_3); m_uiExecutionTimer = 15 * MINUTE * IN_MILLISECONDS; break; case 2: if (Creature* pSoldier = GetSingleCreatureFromStorage(m_uiTeam == ALLIANCE ? NPC_SOLDIER_ALLIANCE_3 : NPC_SOLDIER_HORDE_3)) pSoldier->DealDamage(pSoldier, pSoldier->GetHealth(), nullptr, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, nullptr, false); SetData(TYPE_EXECUTION, FAIL); m_uiExecutionTimer = 0; break; } ++m_uiExecutionStage; } else m_uiExecutionTimer -= uiDiff; }
void instance_shattered_halls::SetData(uint32 uiType, uint32 uiData) { switch (uiType) { case TYPE_NETHEKURSE: m_auiEncounter[uiType] = uiData; if (uiData == DONE) { DoUseDoorOrButton(GO_NETHEKURSE_DOOR); DoUseDoorOrButton(GO_NETHEKURSE_ENTER_DOOR); } break; case TYPE_OMROGG: m_auiEncounter[uiType] = uiData; break; case TYPE_BLADEFIST: m_auiEncounter[uiType] = uiData; if (uiData == DONE) { // Make executioner attackable only after the final boss is dead if (Creature* pExecutioner = GetSingleCreatureFromStorage(NPC_EXECUTIONER, true)) pExecutioner->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); } break; case TYPE_EXECUTION: m_auiEncounter[uiType] = uiData; if (uiData == IN_PROGRESS && !GetSingleCreatureFromStorage(NPC_EXECUTIONER, true)) { if (Player* pPlayer = GetPlayerInMap()) { // summon the 3 npcs for execution for (uint8 i = 2; i < 5; ++i) pPlayer->SummonCreature(m_uiTeam == ALLIANCE ? aSoldiersLocs[i].m_uiAllianceEntry : aSoldiersLocs[i].m_uiHordeEntry, aSoldiersLocs[i].m_fX, aSoldiersLocs[i].m_fY, aSoldiersLocs[i].m_fZ, aSoldiersLocs[i].m_fO, TEMPSPAWN_DEAD_DESPAWN, 0); // Summon the executioner; Note: according to wowhead he shouldn't be targetable until Kargath encounter is finished if (Creature* pExecutioner = pPlayer->SummonCreature(NPC_EXECUTIONER, afExecutionerLoc[0], afExecutionerLoc[1], afExecutionerLoc[2], afExecutionerLoc[3], TEMPSPAWN_DEAD_DESPAWN, 0, true)) pExecutioner->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); // cast the execution spell DoCastGroupDebuff(SPELL_KARGATH_EXECUTIONER_1); } } if (uiData == DONE) { // If the officer is already killed, then skip the quest completion if (m_uiExecutionStage) break; // Complete quest 9524 or 9525 if (Creature* pOfficer = GetSingleCreatureFromStorage(m_uiTeam == ALLIANCE ? NPC_OFFICER_ALLIANCE : NPC_OFFICER_HORDE)) { Map::PlayerList const& lPlayers = instance->GetPlayers(); for (const auto& lPlayer : lPlayers) { if (Player* pPlayer = lPlayer.getSource()) pPlayer->KilledMonsterCredit(pOfficer->GetEntry(), pOfficer->GetObjectGuid()); } } } break; } if (uiData == DONE) { OUT_SAVE_INST_DATA; std::ostringstream saveStream; saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " " << m_auiEncounter[3]; m_strInstData = saveStream.str(); SaveToDB(); OUT_SAVE_INST_DATA_COMPLETE; } }
void instance_shattered_halls::SetData(uint32 uiType, uint32 uiData) { switch (uiType) { case TYPE_NETHEKURSE: m_auiEncounter[uiType] = uiData; if (uiData == DONE) { DoUseDoorOrButton(GO_NETHEKURSE_DOOR); DoUseDoorOrButton(GO_NETHEKURSE_ENTER_DOOR); } break; case TYPE_OMROGG: m_auiEncounter[uiType] = uiData; break; case TYPE_BLADEFIST: m_auiEncounter[uiType] = uiData; if (uiData == DONE) { // Make executioner attackable only after the final boss is dead if (Creature* pExecutioner = GetSingleCreatureFromStorage(NPC_EXECUTIONER, true)) pExecutioner->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); } break; case TYPE_EXECUTION: m_auiEncounter[uiType] = uiData; if (uiData == IN_PROGRESS && !GetSingleCreatureFromStorage(NPC_EXECUTIONER, true)) { if (Player* pPlayer = GetPlayerInMap()) { // summon the 3 npcs for execution for (uint8 i = 2; i < 5; ++i) pPlayer->SummonCreature(m_uiTeam == ALLIANCE ? aSoldiersLocs[i].m_uiAllianceEntry : aSoldiersLocs[i].m_uiHordeEntry, aSoldiersLocs[i].m_fX, aSoldiersLocs[i].m_fY, aSoldiersLocs[i].m_fZ, aSoldiersLocs[i].m_fO, TEMPSUMMON_DEAD_DESPAWN, 0); // Summon the executioner for 80 min; ToDo: set the flags in DB if (Creature* pExecutioner = pPlayer->SummonCreature(NPC_EXECUTIONER, afExecutionerLoc[0], afExecutionerLoc[1], afExecutionerLoc[2], afExecutionerLoc[3], TEMPSUMMON_TIMED_OOC_OR_DEAD_DESPAWN, 80 * MINUTE * IN_MILLISECONDS, true)) pExecutioner->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); // cast the execution spell DoCastGroupDebuff(SPELL_KARGATH_EXECUTIONER_1); } } if (uiData == DONE) { // Allow playes to complete the quest only after the executioner is dead if (Creature* pOfficer = GetSingleCreatureFromStorage(m_uiTeam == ALLIANCE ? NPC_OFFICER_ALLIANCE : NPC_OFFICER_HORDE)) pOfficer->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER); } break; } if (uiData == DONE) { OUT_SAVE_INST_DATA; std::ostringstream saveStream; saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " " << m_auiEncounter[3]; m_strInstData = saveStream.str(); SaveToDB(); OUT_SAVE_INST_DATA_COMPLETE; } }