void SetData(uint32 type, uint32 data) { switch(type) { case DATA_INSTANCE_PROGRESS: if (InstanceProgress < data) { InstanceProgress = data; if (InstanceProgress == INSTANCE_PROGRESS_TYRANNUS_INTRO && instance->GetDifficulty() == DUNGEON_DIFFICULTY_HEROIC && bAchievDontLookUp) // achiev Don't Look Up (4525) DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, 72845); } break; case DATA_GARFROST: m_auiEncounter[0] = data; if (data == DONE) instance->SummonCreature(NPC_GORKUN_IRONSKULL_1, FBSSpawnPos); else // NOT_STARTED, IN_PROGRESS bAchievEleven = true; if (data == DONE && GetData(DATA_ICK) == DONE) if (GameObject* icewall = instance->GetGameObject(GO_IceWallGUID)) icewall->SetGoState(GO_STATE_ACTIVE); break; case DATA_ICK: m_auiEncounter[1] = data; if (data == DONE && GetData(DATA_GARFROST) == DONE) if (GameObject* icewall = instance->GetGameObject(GO_IceWallGUID)) icewall->SetGoState(GO_STATE_ACTIVE); break; case DATA_TYRANNUS: m_auiEncounter[2] = data; if (data == DONE) instance->SummonCreature(NPC_SYLVANAS_PART2, TSLeaderSpawnPos); break; case DATA_ACHIEV_ELEVEN: bAchievEleven = false; break; case DATA_ACHIEV_DONT_LOOK_UP: bAchievDontLookUp = false; break; } if (data == DONE || type == DATA_INSTANCE_PROGRESS) SaveToDB(); }
void SetData(uint32 type, uint32 data) override { switch (type) { case TYPE_COUNTER: TrialCounter = data; data = DONE; break; case TYPE_EVENT: EventStage = data; data = NOT_STARTED; break; case TYPE_EVENT_TIMER: EventTimer = data; data = NOT_STARTED; break; case TYPE_NORTHREND_BEASTS: NorthrendBeasts = data; switch (data) { case GORMOK_IN_PROGRESS: SetBossState(DATA_NORTHREND_BEASTS, IN_PROGRESS); NorthrendBeastsCount = 4; HandlePlayerVehicle(true); break; case GORMOK_DONE: if (Creature* tirion = GetCreature(DATA_FORDRING)) tirion->AI()->DoAction(ACTION_START_JORMUNGARS); HandleNorthrendBeastsDone(); break; case SNAKES_IN_PROGRESS: NotOneButTwoJormungarsTimer = 0; break; case SNAKES_SPECIAL: NotOneButTwoJormungarsTimer = 10*IN_MILLISECONDS; HandleNorthrendBeastsDone(); break; case SNAKES_DONE: if (NotOneButTwoJormungarsTimer > 0) DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_WORMS_KILLED_IN_10_SECONDS); if (Creature* tirion = GetCreature(DATA_FORDRING)) tirion->AI()->DoAction(ACTION_START_ICEHOWL); HandleNorthrendBeastsDone(); break; case ICEHOWL_DONE: HandleNorthrendBeastsDone(); break; case FAIL: HandlePlayerVehicle(false); SetBossState(DATA_NORTHREND_BEASTS, FAIL); if (Creature* tirion = GetCreature(DATA_FORDRING)) tirion->AI()->DoAction(ACTION_NORTHREND_BEASTS_WIPE); break; default: break; } break; case DATA_DESPAWN_SNOBOLDS: for (ObjectGuid const guid : snoboldGUIDS) if (Creature* snobold = instance->GetCreature(guid)) snobold->DespawnOrUnsummon(); snoboldGUIDS.clear(); break; //Achievements case DATA_SNOBOLD_COUNT: if (data == INCREASE) ++SnoboldCount; else if (data == DECREASE) --SnoboldCount; break; case DATA_MISTRESS_OF_PAIN_COUNT: if (data == INCREASE) ++MistressOfPainCount; else if (data == DECREASE) --MistressOfPainCount; break; default: break; } }
void instance_naxxramas::SetData(uint32 uiType, uint32 uiData) { switch(uiType) { case TYPE_ANUB_REKHAN: m_auiEncounter[uiType] = uiData; DoUseDoorOrButton(GO_ARAC_ANUB_DOOR); if (uiData == DONE) { DoUseDoorOrButton(GO_ARAC_ANUB_GATE); DoStartTimedAchievement(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, ACHIEV_START_MAEXXNA_ID); } break; case TYPE_FAERLINA: DoUseDoorOrButton(GO_ARAC_FAER_WEB); if (uiData == IN_PROGRESS) SetSpecialAchievementCriteria(TYPE_ACHIEV_KNOCK_YOU_OUT, true); if (uiData == DONE) { DoUseDoorOrButton(GO_ARAC_FAER_DOOR); DoUseDoorOrButton(GO_ARAC_MAEX_OUTER_DOOR); } m_auiEncounter[uiType] = uiData; break; case TYPE_MAEXXNA: m_auiEncounter[uiType] = uiData; DoUseDoorOrButton(GO_ARAC_MAEX_INNER_DOOR, uiData); if (uiData == DONE) { DoUseDoorOrButton(GO_ARAC_EYE_RAMP); DoUseDoorOrButton(GO_ARAC_EYE_BOSS); DoRespawnGameObject(GO_ARAC_PORTAL, 30*MINUTE); DoToggleGameObjectFlags(GO_ARAC_PORTAL, GO_FLAG_NO_INTERACT, false); m_uiTauntTimer = 5000; } break; case TYPE_NOTH: m_auiEncounter[uiType] = uiData; DoUseDoorOrButton(GO_PLAG_NOTH_ENTRY_DOOR); if (uiData == DONE) { DoUseDoorOrButton(GO_PLAG_NOTH_EXIT_DOOR); DoUseDoorOrButton(GO_PLAG_HEIG_ENTRY_DOOR); } break; case TYPE_HEIGAN: m_auiEncounter[uiType] = uiData; DoUseDoorOrButton(GO_PLAG_HEIG_ENTRY_DOOR); if (uiData == IN_PROGRESS) SetSpecialAchievementCriteria(TYPE_ACHIEV_SAFETY_DANCE, true); if (uiData == DONE) DoUseDoorOrButton(GO_PLAG_HEIG_EXIT_DOOR); break; case TYPE_LOATHEB: m_auiEncounter[uiType] = uiData; DoUseDoorOrButton(GO_PLAG_LOAT_DOOR); if (uiData == IN_PROGRESS) SetSpecialAchievementCriteria(TYPE_ACHIEV_SPORE_LOSER, true); if (uiData == DONE) { DoUseDoorOrButton(GO_PLAG_EYE_RAMP); DoUseDoorOrButton(GO_PLAG_EYE_BOSS); DoRespawnGameObject(GO_PLAG_PORTAL, 30*MINUTE); DoToggleGameObjectFlags(GO_PLAG_PORTAL, GO_FLAG_NO_INTERACT, false); m_uiTauntTimer = 5000; } break; case TYPE_RAZUVIOUS: m_auiEncounter[uiType] = uiData; break; case TYPE_GOTHIK: switch(uiData) { case IN_PROGRESS: DoUseDoorOrButton(GO_MILI_GOTH_ENTRY_GATE); DoUseDoorOrButton(GO_MILI_GOTH_COMBAT_GATE); break; case SPECIAL: DoUseDoorOrButton(GO_MILI_GOTH_COMBAT_GATE); break; case FAIL: if (m_auiEncounter[uiType] == IN_PROGRESS) DoUseDoorOrButton(GO_MILI_GOTH_COMBAT_GATE); DoUseDoorOrButton(GO_MILI_GOTH_ENTRY_GATE); break; case DONE: DoUseDoorOrButton(GO_MILI_GOTH_ENTRY_GATE); DoUseDoorOrButton(GO_MILI_GOTH_EXIT_GATE); DoUseDoorOrButton(GO_MILI_HORSEMEN_DOOR); m_dialogueHelper.StartNextDialogueText(NPC_THANE); break; } m_auiEncounter[uiType] = uiData; break; case TYPE_FOUR_HORSEMEN: // Skip if already set if (m_auiEncounter[uiType] == uiData) return; if (uiData == SPECIAL) { ++m_uiHorseMenKilled; if (m_uiHorseMenKilled == 4) SetData(TYPE_FOUR_HORSEMEN, DONE); // Don't store special data break; } if (uiData == FAIL) m_uiHorseMenKilled = 0; m_auiEncounter[uiType] = uiData; DoUseDoorOrButton(GO_MILI_HORSEMEN_DOOR); if (uiData == DONE) { DoUseDoorOrButton(GO_MILI_EYE_RAMP); DoUseDoorOrButton(GO_MILI_EYE_BOSS); DoRespawnGameObject(GO_MILI_PORTAL, 30*MINUTE); DoToggleGameObjectFlags(GO_MILI_PORTAL, GO_FLAG_NO_INTERACT, false); DoRespawnGameObject(instance->IsRegularDifficulty() ? GO_CHEST_HORSEMEN_NORM : GO_CHEST_HORSEMEN_HERO, 30*MINUTE); m_uiTauntTimer = 5000; // Set achiev credit DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, ACHIEV_SPELL_FOUR_HORSEMEN); } m_auiEncounter[uiType] = uiData; DoUseDoorOrButton(GO_MILI_HORSEMEN_DOOR); break; case TYPE_PATCHWERK: m_auiEncounter[uiType] = uiData; if (uiData == IN_PROGRESS) DoStartTimedAchievement(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, ACHIEV_START_PATCHWERK_ID); if (uiData == DONE) DoUseDoorOrButton(GO_CONS_PATH_EXIT_DOOR); break; case TYPE_GROBBULUS: m_auiEncounter[uiType] = uiData; break; case TYPE_GLUTH: m_auiEncounter[uiType] = uiData; if (uiData == DONE) { DoUseDoorOrButton(GO_CONS_GLUT_EXIT_DOOR); DoUseDoorOrButton(GO_CONS_THAD_DOOR); } break; case TYPE_THADDIUS: // Only process real changes here if (m_auiEncounter[uiType] == uiData) return; m_auiEncounter[uiType] = uiData; if (uiData != SPECIAL) DoUseDoorOrButton(GO_CONS_THAD_DOOR, uiData); // Uncomment when this achievement is implemented //if (uiData == IN_PROGRESS) // SetSpecialAchievementCriteria(TYPE_ACHIEV_SHOCKING, true); if (uiData == DONE) { DoUseDoorOrButton(GO_CONS_EYE_RAMP); DoUseDoorOrButton(GO_CONS_EYE_BOSS); DoRespawnGameObject(GO_CONS_PORTAL, 30*MINUTE); DoToggleGameObjectFlags(GO_CONS_PORTAL, GO_FLAG_NO_INTERACT, false); m_uiTauntTimer = 5000; } break; case TYPE_SAPPHIRON: m_auiEncounter[uiType] = uiData; // Uncomment when achiev check implemented //if (uiData == IN_PROGRESS) // SetSpecialAchievementCriteria(TYPE_ACHIEV_HUNDRED_CLUB, true); if (uiData == DONE) { DoUseDoorOrButton(GO_KELTHUZAD_WATERFALL_DOOR); m_dialogueHelper.StartNextDialogueText(NPC_KELTHUZAD); } break; case TYPE_KELTHUZAD: m_auiEncounter[uiType] = uiData; DoUseDoorOrButton(GO_KELTHUZAD_EXIT_DOOR); if (uiData == IN_PROGRESS) SetSpecialAchievementCriteria(TYPE_ACHIEV_GET_ENOUGH, false); break; case TYPE_UNDYING_FAILED: m_auiEncounter[uiType] = uiData; 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_auiEncounter[4] << " " << m_auiEncounter[5] << " " << m_auiEncounter[6] << " " << m_auiEncounter[7] << " " << m_auiEncounter[8] << " " << m_auiEncounter[9] << " " << m_auiEncounter[10] << " " << m_auiEncounter[11] << " " << m_auiEncounter[12] << " " << m_auiEncounter[13] << " " << m_auiEncounter[14] << " " << m_auiEncounter[15]; m_strInstData = saveStream.str(); SaveToDB(); OUT_SAVE_INST_DATA_COMPLETE; } }
void SetData(uint32 uiType, uint32 uiData) { switch(uiType) { case TYPE_JARAXXUS: if (uiData == DONE) m_uiEvent = 2000; break; case TYPE_CRUSADERS: switch (uiData) { case IN_PROGRESS: m_uiResilienceWillFixItTimer = 0; break; case SPECIAL: //Means the first blood m_uiResilienceWillFixItTimer = 60*IN_MILLISECONDS; uiData = IN_PROGRESS; break; case DONE: DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_DEFEAT_FACTION_CHAMPIONS); if (m_uiResilienceWillFixItTimer > 0) DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_CHAMPIONS_KILLED_IN_MINUTE); if (GameObject* pChest = instance->GetGameObject(m_uiCrusadersCacheGUID)) if (pChest && !pChest->isSpawned()) pChest->SetRespawnTime(7*DAY); m_uiEvent = 3100; break; } break; case TYPE_VALKIRIES: switch (uiData) { case FAIL: if (m_auiEncounter[TYPE_VALKIRIES] == NOT_STARTED) uiData = NOT_STARTED; break; case SPECIAL: if (m_auiEncounter[TYPE_VALKIRIES] == SPECIAL) uiData = DONE; break; case DONE: if (instance->GetPlayers().getFirst()->getSource()->GetTeam() == ALLIANCE) m_uiEvent = 4020; else m_uiEvent = 4030; break; } break; case TYPE_ANUBARAK: switch (uiData) { case DONE: m_uiEvent = 6000; break; case SPECIAL: uint32 tributeChest = 0; if (instance->GetSpawnMode() == RAID_DIFFICULTY_10MAN_HEROIC) { if (m_uiTrialCounter >= 50) tributeChest = GO_TRIBUTE_CHEST_10H_99; else if (m_uiTrialCounter >= 45) tributeChest = GO_TRIBUTE_CHEST_10H_50; else if (m_uiTrialCounter >= 25) tributeChest = GO_TRIBUTE_CHEST_10H_45; else tributeChest = GO_TRIBUTE_CHEST_10H_25; } else if (instance->GetSpawnMode() == RAID_DIFFICULTY_25MAN_HEROIC) { if (m_uiTrialCounter >= 50) tributeChest = GO_TRIBUTE_CHEST_25H_99; else if (m_uiTrialCounter >= 45) tributeChest = GO_TRIBUTE_CHEST_25H_50; else if (m_uiTrialCounter >= 25) tributeChest = GO_TRIBUTE_CHEST_25H_45; else tributeChest = GO_TRIBUTE_CHEST_25H_25; } if (tributeChest) if (Creature* pTirion = instance->GetCreature(m_uiTirionGUID)) if (GameObject* pChest = pTirion->SummonGameObject(tributeChest, 805.62f, 134.87f, 142.16f, 3.27f, 0, 0, 0, 0, 90000000)) pChest->SetRespawnTime(pChest->GetRespawnDelay()); break; } break; case TYPE_COUNTER: m_uiTrialCounter = uiData; uiData = DONE; break; case TYPE_EVENT: m_uiEvent = uiData; uiData = NOT_STARTED; break; case TYPE_EVENT_TIMER: m_uiEventTimer = uiData; uiData = NOT_STARTED; break; case TYPE_NORTHREND_BEASTS: m_uiNorthrendBeasts = uiData; switch (uiData) { case GORMOK_DONE: m_uiEvent = 200; SetData(TYPE_NORTHREND_BEASTS, IN_PROGRESS); SetData(TYPE_BEASTS, IN_PROGRESS); break; case SNAKES_IN_PROGRESS: m_uiNotOneButTwoJormungarsTimer = 0; break; case SNAKES_SPECIAL: m_uiNotOneButTwoJormungarsTimer = 10*IN_MILLISECONDS; break; case SNAKES_DONE: if (m_uiNotOneButTwoJormungarsTimer > 0) DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_WORMS_KILLED_IN_10_SECONDS); m_uiEvent = 300; SetData(TYPE_NORTHREND_BEASTS, IN_PROGRESS); SetData(TYPE_BEASTS, IN_PROGRESS); break; case ICEHOWL_DONE: m_uiEvent = 400; SetData(TYPE_NORTHREND_BEASTS, DONE); SetData(TYPE_BEASTS, DONE); break; case FAIL: SetData(TYPE_BEASTS, FAIL); break; } break; case DATA_HEALTH_TWIN_SHARED: m_uiDataDamageTwin = uiData; uiData = NOT_STARTED; break; //Achievements case DATA_SNOBOLD_COUNT: if (uiData == INCREASE) ++m_uiSnoboldCount; else if (uiData == DECREASE) --m_uiSnoboldCount; break; case DATA_MISTRESS_OF_PAIN_COUNT: if (uiData == INCREASE) ++m_uiMistressOfPainCount; else if (uiData == DECREASE) --m_uiMistressOfPainCount; break; case DATA_TRIBUTE_TO_IMMORTALITY_ELEGIBLE: m_bTributeToImmortalityElegible = false; break; } if (IsEncounterInProgress()) { CloseDoor(GetData64(GO_EAST_PORTCULLIS)); CloseDoor(GetData64(GO_WEB_DOOR)); } else { OpenDoor(GetData64(GO_EAST_PORTCULLIS)); OpenDoor(GetData64(GO_WEB_DOOR)); } if (uiType < MAX_ENCOUNTERS) { sLog->outBasic("[ToCr] m_auiEncounter[uiType %u] %u = uiData %u;", uiType, m_auiEncounter[uiType], uiData); if (uiData == FAIL) { if (IsRaidWiped()) { --m_uiTrialCounter; m_bNeedSave = true; m_uiEvent = (uiType == TYPE_BEASTS? 666 : 0); } uiData = NOT_STARTED; } m_auiEncounter[uiType] = uiData; if (uiData == DONE || m_bNeedSave == true) { if (Unit* pAnnouncer = instance->GetCreature(GetData64(NPC_BARRENT))) pAnnouncer->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); Save(); } } }
void SetData(uint32 type, uint32 data) { switch (type) { case TYPE_COUNTER: TrialCounter = data; data = DONE; break; case TYPE_EVENT: EventStage = data; data = NOT_STARTED; break; case TYPE_EVENT_TIMER: EventTimer = data; data = NOT_STARTED; break; case TYPE_NORTHREND_BEASTS: NorthrendBeasts = data; switch (data) { case GORMOK_DONE: EventStage = 200; SetData(TYPE_NORTHREND_BEASTS, IN_PROGRESS); break; case SNAKES_IN_PROGRESS: NotOneButTwoJormungarsTimer = 0; break; case SNAKES_SPECIAL: NotOneButTwoJormungarsTimer = 10*IN_MILLISECONDS; break; case SNAKES_DONE: if (NotOneButTwoJormungarsTimer > 0) DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_WORMS_KILLED_IN_10_SECONDS); EventStage = 300; SetData(TYPE_NORTHREND_BEASTS, IN_PROGRESS); break; case ICEHOWL_DONE: EventStage = 400; SetData(TYPE_NORTHREND_BEASTS, DONE); SetBossState(BOSS_BEASTS, DONE); break; case FAIL: SetBossState(BOSS_BEASTS, FAIL); break; default: break; } break; //Achievements case DATA_SNOBOLD_COUNT: if (data == INCREASE) ++SnoboldCount; else if (data == DECREASE) --SnoboldCount; break; case DATA_MISTRESS_OF_PAIN_COUNT: if (data == INCREASE) ++MistressOfPainCount; else if (data == DECREASE) --MistressOfPainCount; break; case DATA_TRIBUTE_TO_IMMORTALITY_ELIGIBLE: TributeToImmortalityEligible = false; break; default: break; } }
bool SetBossState(uint32 type, EncounterState state) { if (!InstanceScript::SetBossState(type, state)) return false; switch (type) { case BOSS_BEASTS: break; case BOSS_JARAXXUS: // Cleanup Icehowl if (Creature* icehowl = instance->GetCreature(IcehowlGUID)) icehowl->DespawnOrUnsummon(); if (state == DONE) EventStage = 2000; break; case BOSS_CRUSADERS: // Cleanup Jaraxxus if (Creature* jaraxxus = instance->GetCreature(JaraxxusGUID)) jaraxxus->DespawnOrUnsummon(); if (Creature* fizzlebang = instance->GetCreature(FizzlebangGUID)) fizzlebang->DespawnOrUnsummon(); switch (state) { case IN_PROGRESS: ResilienceWillFixItTimer = 0; break; case SPECIAL: //Means the first blood ResilienceWillFixItTimer = 60*IN_MILLISECONDS; state = IN_PROGRESS; break; case DONE: DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_DEFEAT_FACTION_CHAMPIONS); if (ResilienceWillFixItTimer > 0) DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_CHAMPIONS_KILLED_IN_MINUTE); DoRespawnGameObject(CrusadersCacheGUID, 7*DAY); if (GameObject* cache = instance->GetGameObject(CrusadersCacheGUID)) cache->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); EventStage = 3100; break; default: break; } break; case BOSS_VALKIRIES: // Cleanup chest if (GameObject* cache = instance->GetGameObject(CrusadersCacheGUID)) cache->Delete(); switch (state) { case FAIL: if (GetBossState(BOSS_VALKIRIES) == NOT_STARTED) state = NOT_STARTED; break; case SPECIAL: if (GetBossState(BOSS_VALKIRIES) == SPECIAL) state = DONE; break; case DONE: if (instance->GetPlayers().getFirst()->getSource()->GetTeam() == ALLIANCE) EventStage = 4020; else EventStage = 4030; break; default: break; } break; case BOSS_LICH_KING: break; case BOSS_ANUBARAK: switch (state) { case DONE: { EventStage = 6000; uint32 tributeChest = 0; if (instance->GetSpawnMode() == RAID_DIFFICULTY_10MAN_HEROIC) { if (TrialCounter >= 50) tributeChest = GO_TRIBUTE_CHEST_10H_99; else { if (TrialCounter >= 45) tributeChest = GO_TRIBUTE_CHEST_10H_50; else { if (TrialCounter >= 25) tributeChest = GO_TRIBUTE_CHEST_10H_45; else tributeChest = GO_TRIBUTE_CHEST_10H_25; } } } else if (instance->GetSpawnMode() == RAID_DIFFICULTY_25MAN_HEROIC) { if (TrialCounter >= 50) tributeChest = GO_TRIBUTE_CHEST_25H_99; else { if (TrialCounter >= 45) tributeChest = GO_TRIBUTE_CHEST_25H_50; else { if (TrialCounter >= 25) tributeChest = GO_TRIBUTE_CHEST_25H_45; else tributeChest = GO_TRIBUTE_CHEST_25H_25; } } } if (tributeChest) if (Creature* tirion = instance->GetCreature(TirionGUID)) if (GameObject* chest = tirion->SummonGameObject(tributeChest, 805.62f, 134.87f, 142.16f, 3.27f, 0, 0, 0, 0, WEEK)) chest->SetRespawnTime(chest->GetRespawnDelay()); break; } default: break; } break; default: break; } if (IsEncounterInProgress()) { CloseDoor(GetData64(GO_EAST_PORTCULLIS)); CloseDoor(GetData64(GO_WEB_DOOR)); } else { OpenDoor(GetData64(GO_EAST_PORTCULLIS)); OpenDoor(GetData64(GO_WEB_DOOR)); } if (type < MAX_ENCOUNTERS) { TC_LOG_INFO(LOG_FILTER_TSCR, "[ToCr] BossState(type %u) %u = state %u;", type, GetBossState(type), state); if (state == FAIL) { if (instance->IsHeroic()) { --TrialCounter; // decrease attempt counter at wipe Map::PlayerList const &PlayerList = instance->GetPlayers(); for (Map::PlayerList::const_iterator itr = PlayerList.begin(); itr != PlayerList.end(); ++itr) if (Player* player = itr->getSource()) player->SendUpdateWorldState(UPDATE_STATE_UI_COUNT, TrialCounter); // if theres no more attemps allowed if (!TrialCounter) { if (Unit* announcer = instance->GetCreature(GetData64(NPC_BARRENT))) announcer->ToCreature()->DespawnOrUnsummon(); if (Creature* anubArak = instance->GetCreature(GetData64(NPC_ANUBARAK))) anubArak->DespawnOrUnsummon(); } } NeedSave = true; EventStage = (type == BOSS_BEASTS ? 666 : 0); state = NOT_STARTED; } if (state == DONE || NeedSave) { if (Unit* announcer = instance->GetCreature(GetData64(NPC_BARRENT))) announcer->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); Save(); } } return true; }
void SetData(uint32 type, uint32 data) { switch (type) { case DATA_MEATHOOK_EVENT: _encounterState[0] = data; break; case DATA_SALRAMM_EVENT: if(data == DONE) { DoUpdateWorldState(WORLDSTATE_WAVE_COUNT, 0); if(ArthasNeedsTeleport()) if(Creature* arthas = instance->GetCreature(_arthasGUID)) arthas->AI()->SetData(1, 0); } _encounterState[1] = data; break; case DATA_EPOCH_EVENT: _encounterState[2] = data; break; case DATA_MAL_GANIS_EVENT: _encounterState[3] = data; switch (_encounterState[3]) { case NOT_STARTED: HandleGameObject(_malGanisGate2GUID, true); break; case IN_PROGRESS: HandleGameObject(_malGanisGate2GUID, false); break; case DONE: HandleGameObject(_exitGateGUID, true); if (GameObject* go = instance->GetGameObject(_malGanisChestGUID)) { go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND); go->SetPhaseMask(1, true); } instance->SummonCreature(NPC_CHROMIE_3, ChromieExitSummonPos); Map::PlayerList const &players = instance->GetPlayers(); for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) itr->getSource()->KilledMonsterCredit(31006, 0); break; } break; case DATA_INFINITE_EVENT: _encounterState[4] = data; switch(data) { case DONE: DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, 0); //DoCompleteAchievement(ACHIEVEMENT_CULLING_TIME); break; case FAIL: DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, 0); if(Creature* infinite = instance->GetCreature(_infiniteGUID)) infinite->AI()->DoAction(0); break; case IN_PROGRESS: DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN_SHOW, 1); DoUpdateWorldState(WORLDSTATE_TIME_GUARDIAN, 25); timerVisible = true; instance->SummonCreature(NPC_INFINITE, InfiniteSummonPos); break; } break; case DATA_ARTHAS_EVENT: if(data == FAIL) { if(Creature* deadArthas = instance->GetCreature(_arthasGUID)) { deadArthas->DespawnOrUnsummon(10000); int index; if(_artasStepUi >= 83) // Before last run index = 2; else if(_artasStepUi >= 60) // Before the council index = 1; else // entrance of city index = 0; if(Creature* newArthas = instance->SummonCreature(NPC_ARTHAS, ArthasSpawnPositions[index])) newArthas->AI()->SetData(0, (uint32)pow(2.0f, index)); } } break; case DATA_CRATE_COUNT: _crateCount = data; DoUpdateWorldState(WORLDSTATE_CRATES_REVEALED, _crateCount); if (_crateCount == 5) { if (Creature* bunny = instance->GetCreature(_genericBunnyGUID)) bunny->CastSpell(bunny, SPELL_CRATES_CREDIT, true); // Summon Chromie and global whisper if (Creature* chromie = instance->SummonCreature(NPC_CHROMIE_2, ChromieSummonPos)) if (!instance->GetPlayers().isEmpty()) if (Player* player = instance->GetPlayers().getFirst()->getSource()) sCreatureTextMgr->SendChat(chromie, SAY_CRATES_COMPLETED, player->GetGUID(), CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_ZONE); DoUpdateWorldState(WORLDSTATE_SHOW_CRATES, 0); if(Creature* crier = instance->GetCreature(_lordaeronCrierGUID)) crier->YellToZone(-1595053, LANG_UNIVERSAL, 0); } break; case DATA_TRANSFORM_CITIZENS: switch(data) { case SPECIAL: // Respawn Zombies while(!_zombiesList.empty()) { Creature* summon = instance->GetCreature(*_zombiesList.begin()); if(!summon) _zombiesList.erase(_zombiesList.begin()); else { _zombiesList.erase(_zombiesList.begin()); if(TempSummon* summ = summon->ToTempSummon()) { summon->DestroyForNearbyPlayers(); summ->UnSummon(); } else summon->DisappearAndDie(); } } case IN_PROGRESS: // Transform Citizens for(std::list<uint64>::iterator itr = _citizensList.begin(); itr != _citizensList.end(); ++itr) if(Creature* citizen = instance->GetCreature((*itr))) { if(Creature* arthas = instance->GetCreature(GetData64(DATA_ARTHAS))) if(Creature* risenZombie = arthas->SummonCreature(NPC_ZOMBIE, citizen->GetPositionX(), citizen->GetPositionY(), citizen->GetPositionZ(), citizen->GetOrientation())) //, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000)) { _zombiesList.push_back(risenZombie->GetGUID()); risenZombie->SetRespawnTime(60); risenZombie->GetMotionMaster()->MoveRandom(10.0f); } citizen->SetPhaseMask(2, true); } break; } break; case DATA_ZOMBIEFEST: if(!instance->IsHeroic() || GetData(DATA_ZOMBIEFEST) == DONE) break; switch(data) { case DONE: //DoCompleteAchievement(ACHIEVEMENT_ZOMBIEFEST); _zombieFest = data; break; case IN_PROGRESS: _zombieFest = data; break; case FAIL: _killedZombieCount = 0; _zombieTimer = 60000; _zombieFest = data; DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_CREATURE, ACHIEVEMENT_ZOMBIEFEST); break; case SPECIAL: _killedZombieCount++; DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, 27737, 1); if(_killedZombieCount == 1) { SetData(DATA_ZOMBIEFEST, IN_PROGRESS); DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_CREATURE, ACHIEVEMENT_ZOMBIEFEST); } else if(_killedZombieCount >= 100 && GetData(DATA_ZOMBIEFEST) == IN_PROGRESS) SetData(DATA_ZOMBIEFEST, DONE); //else //{ //if(_killedZombieCount%10 == 0); //} break; } break; case DATA_ARTHAS_STEP: _artasStepUi = data; return; case DATA_SKIP: _skipUi = data; } if (data == DONE) SaveToDB(); }
void SetData(uint32 type, uint32 data) { switch(type) { case BOSS_GRAND_CHAMPIONS: m_auiEncounter[0] = data; if (data == SPECIAL) { for (std::list<uint64>::const_iterator itr = VehicleList.begin(); itr != VehicleList.end(); ++itr) if (Creature* summon = instance->GetCreature(*itr)) summon->RemoveFromWorld(); } else if (data == IN_PROGRESS) { for (uint8 i=0; i<3; i++) if (Creature* boss = instance->GetCreature(grandChampionGUID[i])) AggroAllPlayers(boss); } else if (data == DONE) { DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_ACHIEVEMENT_CHAMPIONS); if (Creature* announcer = instance->GetCreature(uiAnnouncerGUID)) { announcer->GetMotionMaster()->MovePoint(0, 742.742f, 630.207f, 411.172f); announcer->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); announcer->SummonGameObject(instance->IsHeroic()? GO_CHAMPIONS_LOOT_H : GO_CHAMPIONS_LOOT, 746.59f, 618.49f, 411.09f, 1.42f, 0, 0, 0, 0, 90000000); } } break; case BOSS_ARGENT_CHALLENGE_E: m_auiEncounter[1] = data; if (data == DONE) { if (Creature* announcer = instance->GetCreature(uiAnnouncerGUID)) { DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_ACHIEVEMENT_EADRIC); announcer->GetMotionMaster()->MovePoint(0, 742.742f, 630.207f, 411.172f); announcer->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); announcer->SummonGameObject(instance->IsHeroic()? GO_EADRIC_LOOT_H : GO_EADRIC_LOOT, 746.59f, 618.49f, 411.09f, 1.42f, 0, 0, 0, 0, 90000000); } } break; case BOSS_ARGENT_CHALLENGE_P: m_auiEncounter[2] = data; if (data == DONE) { if (Creature* announcer = instance->GetCreature(uiAnnouncerGUID)) { DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_ACHIEVEMENT_PALETRESS); DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_ACHIEVEMENT_MEMORIES); announcer->GetMotionMaster()->MovePoint(0, 742.742f, 630.207f, 411.172f); announcer->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); announcer->SummonGameObject(instance->IsHeroic()? GO_PALETRESS_LOOT_H : GO_PALETRESS_LOOT, 746.59f, 618.49f, 411.09f, 1.42f, 0, 0, 0, 0, 90000000); } } break; case BOSS_BLACK_KNIGHT: m_auiEncounter[3] = data; if (data == DONE) DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_ACHIEVEMENT_BLACK_KNIGHT); break; case DATA_GRAND_CHAMPION_ENTRY: for (uint8 i=0; i<3; i++) { if (grandChampionEntry[i] == 0) { grandChampionEntry[i] = data; return; } } break; case DATA_MEMORY_ENTRY: memoryEntry = data; break; case DATA_I_VE_HAD_WORSE: achievementHadWorse = (bool)data; break; } if (type != DATA_I_VE_HAD_WORSE) { if (data == DONE || data == FAIL) HandleGameObject(GetData64(DATA_PORTCULLIS), true); else if (data == IN_PROGRESS) HandleGameObject(GetData64(DATA_PORTCULLIS), false); if (data == DONE) SaveToDB(); } }
void instance_trial_of_the_crusader::SetData(uint32 uiType, uint32 uiData) { switch(uiType) { case TYPE_STAGE: m_auiEncounter[TYPE_STAGE] = uiData; break; case TYPE_BEASTS: m_auiEncounter[TYPE_BEASTS] = uiData; if (uiData == IN_PROGRESS) SetSpecialAchievementCriteria(TYPE_UPPER_BACK_PAIN, false); break; case TYPE_JARAXXUS: m_auiEncounter[TYPE_JARAXXUS] = uiData; if (uiData == IN_PROGRESS) SetSpecialAchievementCriteria(TYPE_THREE_SIXTY_PAIN_SPIKE, false); break; case TYPE_CRUSADERS: if (uiData == FAIL && (m_auiEncounter[TYPE_CRUSADERS] == FAIL || m_auiEncounter[TYPE_CRUSADERS] == NOT_STARTED)) m_auiEncounter[TYPE_CRUSADERS] = NOT_STARTED; else m_auiEncounter[TYPE_CRUSADERS] = uiData; if (uiData == DONE) { if (Creature* pTirion = GetSingleCreatureFromStorage(NPC_TIRION)) DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_ACHIEV_FACTION_CHAMPIONS_DEFEAT); uint32 uiCacheEntry = GO_CRUSADERS_CACHE_10; switch (instance->GetDifficulty()) { case RAID_DIFFICULTY_10MAN_HEROIC: uiCacheEntry = GO_CRUSADERS_CACHE_10_H; break; case RAID_DIFFICULTY_25MAN_NORMAL: uiCacheEntry = GO_CRUSADERS_CACHE_25; break; case RAID_DIFFICULTY_25MAN_HEROIC: uiCacheEntry = GO_CRUSADERS_CACHE_25_H; break; } if (GameObject* pChest = GetSingleGameObjectFromStorage(uiCacheEntry)) if (!pChest->isSpawned()) pChest->SetRespawnTime(7*DAY); }; break; case TYPE_CRUSADERS_COUNT: if (uiData == 0) --m_auiCrusadersCount; else m_auiCrusadersCount = uiData; break; case TYPE_CRUSADERS_DEAD: m_auiCrusadersDead = uiData; break; case TYPE_CRUSADERS_ACHIEV_TIMER: if(m_auiCrusadersAchievFail) break; if (m_auiCrusadersAchievTimer <= uiData) m_auiCrusadersAchievFail = 1; else m_auiCrusadersAchievTimer -= uiData; break; case TYPE_CRUSADERS_ACHIEV_FAIL: m_auiCrusadersAchievFail = uiData; break; case TYPE_VALKIRIES: /*if (m_auiEncounter[4] == SPECIAL && uiData == SPECIAL) uiData = DONE;*/ m_auiEncounter[TYPE_VALKIRIES] = uiData; break; case TYPE_LICH_KING: m_auiEncounter[TYPE_LICH_KING] = uiData; break; case TYPE_ANUBARAK: m_auiEncounter[TYPE_ANUBARAK] = uiData; if (uiData == IN_PROGRESS) { DoCloseDoor(GO_WEB_DOOR); } else DoOpenDoor(GO_WEB_DOOR); if (uiData == DONE) { if (Difficulty == RAID_DIFFICULTY_10MAN_HEROIC) { if (m_auiEncounter[TYPE_COUNTER] >= 25) m_uiTributeChest1 = GO_TRIBUTE_CHEST_10H_25; if (m_auiEncounter[TYPE_COUNTER] >= 45) m_uiTributeChest2 = GO_TRIBUTE_CHEST_10H_45; if (m_auiEncounter[TYPE_COUNTER] > 49) m_uiTributeChest3 = GO_TRIBUTE_CHEST_10H_50; m_uiTributeChest4 = GO_TRIBUTE_CHEST_10H_99; } if (Difficulty == RAID_DIFFICULTY_25MAN_HEROIC) { if (m_auiEncounter[TYPE_COUNTER] >= 25) m_uiTributeChest1 = GO_TRIBUTE_CHEST_25H_25; if (m_auiEncounter[TYPE_COUNTER] >= 45) m_uiTributeChest2 = GO_TRIBUTE_CHEST_25H_45; if (m_auiEncounter[TYPE_COUNTER] > 49) m_uiTributeChest3 = GO_TRIBUTE_CHEST_25H_50; m_uiTributeChest4 = GO_TRIBUTE_CHEST_25H_99; } // Attention! It is (may be) not off-like, but spawning all Tribute Chests is real // reward for clearing TOC instance if (m_uiTributeChest1) if (GameObject* pChest1 = GetSingleGameObjectFromStorage(m_uiTributeChest1)) if (pChest1 && !pChest1->isSpawned()) pChest1->SetRespawnTime(7*DAY); if (m_uiTributeChest2) if (GameObject* pChest2 = GetSingleGameObjectFromStorage(m_uiTributeChest2)) if (pChest2 && !pChest2->isSpawned()) pChest2->SetRespawnTime(7*DAY); if (m_uiTributeChest3) if (GameObject* pChest3 = GetSingleGameObjectFromStorage(m_uiTributeChest3)) if (pChest3 && !pChest3->isSpawned()) pChest3->SetRespawnTime(7*DAY); if (m_uiTributeChest4) if (GameObject* pChest4 = GetSingleGameObjectFromStorage(m_uiTributeChest4)) if (pChest4 && !pChest4->isSpawned()) pChest4->SetRespawnTime(7*DAY); }; break; case TYPE_COUNTER: m_auiEncounter[TYPE_COUNTER] = uiData; if (uiData < 25) SetSpecialAchievementCriteria(TYPE_SKILL, false); if (uiData < 45) SetSpecialAchievementCriteria(TYPE_MAD_SKILL, false); if (uiData < 50) { SetSpecialAchievementCriteria(TYPE_INSANITY, false); SetSpecialAchievementCriteria(TYPE_IMMORTALITY, false); } //uiData = DONE; break; case TYPE_DEATHS: m_auiEncounter[TYPE_DEATHS] += uiData; if (GetData(TYPE_DEATHS)) SetSpecialAchievementCriteria(TYPE_IMMORTALITY, false); break; case TYPE_EVENT: m_auiEncounter[TYPE_EVENT] = uiData; uiData = NOT_STARTED; break; case TYPE_EVENT_TIMER: m_auiEventTimer = uiData; uiData = NOT_STARTED; break; case TYPE_NORTHREND_BEASTS: m_auiNorthrendBeasts = uiData; break; case DATA_HEALTH_FJOLA: m_uiDataDamageFjola = uiData; uiData = NOT_STARTED; break; case DATA_HEALTH_EYDIS: m_uiDataDamageEydis = uiData; uiData = NOT_STARTED; break; } if (IsEncounterInProgress()) { DoCloseDoor(GO_WEST_PORTCULLIS); DoCloseDoor(GO_NORTH_PORTCULLIS); DoCloseDoor(GO_SOUTH_PORTCULLIS); if (Creature* pBarrent = GetSingleCreatureFromStorage(NPC_BARRENT)) pBarrent->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); } else { DoOpenDoor(GO_WEST_PORTCULLIS); DoCloseDoor(GO_NORTH_PORTCULLIS); DoCloseDoor(GO_SOUTH_PORTCULLIS); if (Creature* pBarrent = GetSingleCreatureFromStorage(NPC_BARRENT)) pBarrent->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); }; if (uiData == FAIL && uiType != TYPE_STAGE && uiType != TYPE_EVENT && uiType != TYPE_COUNTER && uiType != TYPE_EVENT_TIMER) { if (IsRaidWiped()) { //--m_auiEncounter[TYPE_COUNTER]; SetData(TYPE_COUNTER, GetData(TYPE_COUNTER) - 1); needsave = true; UpdateWorldState(); } uiData = NOT_STARTED; } if ((uiData == DONE && uiType != TYPE_STAGE && uiType != TYPE_EVENT && uiType != TYPE_EVENT_TIMER) || needsave == true) { OUT_SAVE_INST_DATA; std::ostringstream saveStream; for(uint8 i = 0; i < MAX_ENCOUNTERS; ++i) saveStream << m_auiEncounter[i] << " "; m_strInstData = saveStream.str(); SaveToDB(); OUT_SAVE_INST_DATA_COMPLETE; needsave = false; } }