void instance_ulduar::OnObjectCreate(GameObject *pGo) { switch(pGo->GetEntry()) { // doors & other // The siege case GO_SHIELD_WALL: break; case GO_LEVIATHAN_GATE: if(m_auiEncounter[0] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_XT002_GATE: pGo->SetGoState(GO_STATE_READY); if(m_auiEncounter[0] == DONE || m_auiEncounter[3] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_BROKEN_HARPOON: m_lBreakHarpoonGUID.push_back(pGo->GetObjectGuid()); pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NO_INTERACT); break; // Archivum case GO_IRON_ENTRANCE_DOOR: break; case GO_ARCHIVUM_DOOR: pGo->SetGoState(GO_STATE_READY); if(m_auiEncounter[4]) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_ARCHIVUM_CONSOLE: case GO_UNIVERSE_FLOOR_ARCHIVUM: // Celestial Planetarium case GO_CELESTIAL_ACCES: case GO_CELESTIAL_DOOR: case GO_UNIVERSE_FLOOR_CELESTIAL: case GO_AZEROTH_GLOBE: break; // Shattered Hallway case GO_KOLOGARN_BRIDGE: pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_SHATTERED_DOOR: break; // The keepers // Hodir case GO_HODIR_EXIT: if(m_auiEncounter[TYPE_HODIR] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_HODIR_ICE_WALL: if(m_auiEncounter[TYPE_HODIR] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_HODIR_ENTER: pGo->SetGoState(GO_STATE_ACTIVE); break; // Mimiron case GO_MIMIRON_TRAM: if (m_auiEncounter[TYPE_AURIAYA] == DONE) { pGo->SetUInt32Value(GAMEOBJECT_LEVEL, 0); pGo->SetGoState(GO_STATE_READY); } break; case GO_MIMIRON_BUTTON: if (m_auiEncounter[TYPE_MIMIRON] == NOT_STARTED) pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NO_INTERACT); break; case GO_MIMIRON_DOOR_1: case GO_MIMIRON_DOOR_2: case GO_MIMIRON_DOOR_3: case GO_MIMIRON_ELEVATOR: case GO_MIMIRON_TEL1: case GO_MIMIRON_TEL2: case GO_MIMIRON_TEL3: case GO_MIMIRON_TEL4: case GO_MIMIRON_TEL5: case GO_MIMIRON_TEL6: case GO_MIMIRON_TEL7: case GO_MIMIRON_TEL8: case GO_MIMIRON_TEL9: // Thorim case GO_DARK_IRON_PORTCULIS: case GO_RUNED_STONE_DOOR: case GO_THORIM_STONE_DOOR: case GO_LIGHTNING_FIELD: break; case GO_DOOR_LEVER: pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NO_INTERACT); break; // Prison case GO_ANCIENT_GATE: DoOpenMadnessDoorIfCan(); break; case GO_VEZAX_GATE: pGo->SetGoState(GO_STATE_READY); if(m_auiEncounter[11]) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_YOGG_GATE: case GO_BRAIN_DOOR1: case GO_BRAIN_DOOR2: case GO_BRAIN_DOOR3: // loot // Kologarn case GO_CACHE_OF_LIVING_STONE: case GO_CACHE_OF_LIVING_STONE_H: // Hodir case GO_CACHE_OF_WINTER: case GO_CACHE_OF_RARE_WINTER: case GO_CACHE_OF_WINTER_H: case GO_CACHE_OF_RARE_WINTER_H: // Freya case GO_FREYA_GIFT: case GO_FREYA_GIFT_HARD: case GO_FREYA_GIFT_H: case GO_FREYA_GIFT_HARD_H: // Thorim case GO_CACHE_OF_STORMS: case GO_CACHE_OF_RARE_STORMS: case GO_CACHE_OF_STORMS_H: case GO_CACHE_OF_RARE_STORMS_H: // Mimiron case GO_CACHE_OF_INOV: case GO_CACHE_OF_INOV_HARD: case GO_CACHE_OF_INOV_H: case GO_CACHE_OF_INOV_HARD_H: // Alagon case GO_GIFT_OF_OBSERVER: case GO_GIFT_OF_OBSERVER_H: break; default: return; } m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); }
void instance_ulduar::SetData(uint32 uiType, uint32 uiData) { switch(uiType) { case TYPE_LEVIATHAN: m_auiEncounter[uiType] = uiData; DoUseDoorOrButton(GO_SHIELD_WALL); if (uiData == DONE) OpenDoor(GO_LEVIATHAN_GATE); break; case TYPE_IGNIS: m_auiEncounter[uiType] = uiData; if (uiData == IN_PROGRESS) { SetSpecialAchievementCriteria(TYPE_ACHIEV_SHATTERED, false); DoStartTimedAchievement(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, ACHIEV_START_IGNIS_ID); } // Add respawn and kill if (uiData == FAIL) { for (GUIDList::iterator itr = m_lIronConstructsGuids.begin(); itr != m_lIronConstructsGuids.end(); ++itr) { if (Creature *pAdd = instance->GetCreature(*itr)) if (!pAdd->isAlive()) pAdd->Respawn(); } } if (uiData == DONE) { for (GUIDList::iterator itr = m_lIronConstructsGuids.begin(); itr != m_lIronConstructsGuids.end(); ++itr) { if (Creature *pAdd = instance->GetCreature(*itr)) if (pAdd->isAlive()) pAdd->DealDamage(pAdd, pAdd->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, NULL, false); } } break; case TYPE_RAZORSCALE: m_auiEncounter[uiType] = uiData; if (uiData == IN_PROGRESS) { SetSpecialAchievementCriteria(TYPE_ACHIEV_QUICK_SHAVE, true); SetSpecialAchievementCriteria(TYPE_ACHIEV_IRON_DWARF_MEDIUM_RARE, false); } break; case TYPE_XT002: m_auiEncounter[uiType] = uiData; if (uiData == DONE || uiData == FAIL) OpenDoor(GO_XT002_GATE); else if (uiData == IN_PROGRESS) { CloseDoor(GO_XT002_GATE); SetSpecialAchievementCriteria(TYPE_ACHIEV_NERF_ENGINEERING, true); SetSpecialAchievementCriteria(TYPE_ACHIEV_HEARTBREAKER, false); DoStartTimedAchievement(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, ACHIEV_START_XT_002_ID); } break; case TYPE_ASSEMBLY: m_auiEncounter[uiType] = uiData; if (uiData == DONE) { OpenDoor(GO_IRON_ENTRANCE_DOOR); OpenDoor(GO_ARCHIVUM_DOOR); OpenDoor(GO_SHATTERED_DOOR); } else if (uiData == IN_PROGRESS) { SetSpecialAchievementCriteria(TYPE_ACHIEV_YOU_BRUNDIR, true); SetSpecialAchievementCriteria(TYPE_ACHIEV_YOU_MOLGEIM, true); SetSpecialAchievementCriteria(TYPE_ACHIEV_YOU_STEELBREAKER, true); CloseDoor(GO_IRON_ENTRANCE_DOOR); } else if (uiData == FAIL) { if (Creature* pBrundir = GetSingleCreatureFromStorage(NPC_BRUNDIR)) { if (!pBrundir->isAlive()) pBrundir->Respawn(); } if (Creature* pMolgeim = GetSingleCreatureFromStorage(NPC_MOLGEIM)) { if (!pMolgeim->isAlive()) pMolgeim->Respawn(); } if (Creature* pSteelbreaker = GetSingleCreatureFromStorage(NPC_STEELBREAKER)) { if (!pSteelbreaker->isAlive()) pSteelbreaker->Respawn(); } OpenDoor(GO_IRON_ENTRANCE_DOOR); } break; case TYPE_KOLOGARN: m_auiEncounter[uiType] = uiData; if (uiData == DONE) { if (instance->IsRegularDifficulty()) { DoRespawnGameObject(GO_CACHE_OF_LIVING_STONE, 30*MINUTE); } else { DoRespawnGameObject(GO_CACHE_OF_LIVING_STONE_H, 30*MINUTE); } if (GameObject* pGo = GetSingleGameObjectFromStorage(GO_KOLOGARN_BRIDGE)) { pGo->SetUInt32Value(GAMEOBJECT_LEVEL, 0); pGo->SetGoState(GO_STATE_READY); } } if (uiData == IN_PROGRESS) { SetSpecialAchievementCriteria(TYPE_ACHIEV_DISARMED, false); SetSpecialAchievementCriteria(TYPE_ACHIEV_OPEN_ARMS, true); SetSpecialAchievementCriteria(TYPE_ACHIEV_RUBBLE_AND_ROLL, false); } break; case TYPE_AURIAYA: m_auiEncounter[uiType] = uiData; if (uiData == DONE) { if (GameObject* pGO = GetSingleGameObjectFromStorage(GO_MIMIRON_TRAM)) { pGO->SetUInt32Value(GAMEOBJECT_LEVEL, 0); pGO->SetGoState(GO_STATE_READY); } } if (uiData == IN_PROGRESS) { SetSpecialAchievementCriteria(TYPE_ACHIEV_NINE_LIVES, false); SetSpecialAchievementCriteria(TYPE_ACHIEV_CRAZY_CAT_LADY, true); } break; // Keepers case TYPE_MIMIRON: m_auiEncounter[uiType] = uiData; DoUseDoorOrButton(GO_MIMIRON_DOOR_1); DoUseDoorOrButton(GO_MIMIRON_DOOR_2); DoUseDoorOrButton(GO_MIMIRON_DOOR_3); if (uiData == DONE) { if (m_auiHardBoss[3] != DONE) { if (instance->IsRegularDifficulty()) { DoRespawnGameObject(GO_CACHE_OF_INOV, 30*MINUTE); } else { DoRespawnGameObject(GO_CACHE_OF_INOV_H, 30*MINUTE); } } // used to make the friendly keeper visible if(Creature* pImage = GetSingleCreatureFromStorage(KEEPER_MIMIRON)) pImage->SetVisibility(VISIBILITY_ON); DoOpenMadnessDoorIfCan(); } if (uiData == IN_PROGRESS) SetSpecialAchievementCriteria(TYPE_ACHIEV_FIREFIGHTER, false); break; case TYPE_HODIR: m_auiEncounter[uiType] = uiData; if (uiData == DONE) { OpenDoor(GO_HODIR_ENTER); DoUseDoorOrButton(GO_HODIR_ICE_WALL); DoUseDoorOrButton(GO_HODIR_EXIT); if(instance->IsRegularDifficulty()) { DoRespawnGameObject(GO_CACHE_OF_WINTER, 30*MINUTE); } else { DoRespawnGameObject(GO_CACHE_OF_WINTER_H, 30*MINUTE); } // used to make the friendly keeper visible if(Creature* pImage = GetSingleCreatureFromStorage(KEEPER_HODIR)) pImage->SetVisibility(VISIBILITY_ON); DoOpenMadnessDoorIfCan(); } else if (uiData == IN_PROGRESS) { SetSpecialAchievementCriteria(TYPE_ACHIEV_CHEESE_FREEZE, true); SetSpecialAchievementCriteria(TYPE_ACHIEV_COOLEST_FRIEND, true); SetSpecialAchievementCriteria(TYPE_ACHIEV_RARE_CACHE, true); CloseDoor(GO_HODIR_ENTER); } else if (uiData == FAIL) OpenDoor(GO_HODIR_ENTER); break; case TYPE_THORIM: m_auiEncounter[uiType] = uiData; DoUseDoorOrButton(GO_LIGHTNING_FIELD); if (uiData == IN_PROGRESS) { SetSpecialAchievementCriteria(TYPE_ACHIEV_SIFFED, false); SetSpecialAchievementCriteria(TYPE_ACHIEV_LOSE_YOUR_ILLUSION, false); DoUseDoorOrButton(GO_DARK_IRON_PORTCULIS); } if (uiData == DONE) { if(m_auiHardBoss[5] != DONE) { if (instance->IsRegularDifficulty()) { DoRespawnGameObject(GO_CACHE_OF_STORMS, 30*MINUTE); } else { DoRespawnGameObject(GO_CACHE_OF_STORMS_H, 30*MINUTE); } } // used to make the friendly keeper visible if(Creature* pImage = GetSingleCreatureFromStorage(KEEPER_THORIM)) pImage->SetVisibility(VISIBILITY_ON); DoOpenMadnessDoorIfCan(); } break; case TYPE_FREYA: m_auiEncounter[uiType] = uiData; if (uiData == DONE) { // do this in order to see how many elders were alive and spawn the correct chest // hard mode drop if(m_auiHardBoss[6] != DONE) { if (instance->IsRegularDifficulty()) { DoRespawnGameObject(GO_FREYA_GIFT, 30*MINUTE); } else { DoRespawnGameObject(GO_FREYA_GIFT_H, 30*MINUTE); } } // used to make the friendly keeper visible if(Creature* pImage = GetSingleCreatureFromStorage(KEEPER_FREYA)) pImage->SetVisibility(VISIBILITY_ON); DoOpenMadnessDoorIfCan(); } if (uiData == IN_PROGRESS) { SetSpecialAchievementCriteria(TYPE_ACHIEV_BACK_TO_NATURE, false); SetSpecialAchievementCriteria(TYPE_ACHIEV_KNOCK_WOOD, false); SetSpecialAchievementCriteria(TYPE_ACHIEV_KNOCK_KNOCK_WOOD, false); SetSpecialAchievementCriteria(TYPE_ACHIEV_KNOCK_KNOCK_KNOCK_WOOD, false); } break; // Prison case TYPE_VEZAX: m_auiEncounter[uiType] = uiData; if (uiData == DONE) DoUseDoorOrButton(GO_VEZAX_GATE); if (uiData == IN_PROGRESS) { SetSpecialAchievementCriteria(TYPE_ACHIEV_MORNING_SARONITE, false); } break; case TYPE_YOGGSARON: m_auiEncounter[uiType] = uiData; DoUseDoorOrButton(GO_YOGG_GATE); if (uiData == IN_PROGRESS) { DoStartTimedAchievement(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, ACHIEV_START_YOGG_SARON_ID); SetSpecialAchievementCriteria(TYPE_ACHIEV_THREE_LIGHTS, false); SetSpecialAchievementCriteria(TYPE_ACHIEV_TWO_LIGHTS, false); SetSpecialAchievementCriteria(TYPE_ACHIEV_ONE_LIGHT, false); SetSpecialAchievementCriteria(TYPE_ACHIEV_ALONE, false); } if (uiData == FAIL) { // respawn clouds for(GUIDList::iterator iter = m_lCLoudGuids.begin(); iter != m_lCLoudGuids.end(); ++iter) if (Creature *pTmp = instance->GetCreature(*iter)) pTmp->Respawn(); // respawn Sara if(Creature* pSara = GetSingleCreatureFromStorage(NPC_SARA)) { if (!pSara->isAlive()) pSara->Respawn(); else pSara->AI()->EnterEvadeMode(); } if (Creature* pYoggBrain = GetSingleCreatureFromStorage(NPC_YOGG_BRAIN)) { if(!pYoggBrain->isAlive()) pYoggBrain->Respawn(); else pYoggBrain->AI()->EnterEvadeMode(); } } break; // Celestial Planetarium case TYPE_ALGALON: m_auiEncounter[uiType] = uiData; DoUseDoorOrButton(GO_CELESTIAL_DOOR); DoUseDoorOrButton(GO_UNIVERSE_FLOOR_CELESTIAL); if (uiData == DONE) DoRespawnGameObject(GO_GIFT_OF_OBSERVER, 30*MINUTE); break; // Hard modes case TYPE_LEVIATHAN_HARD: m_auiHardBoss[0] = uiData; break; case TYPE_XT002_HARD: m_auiHardBoss[1] = uiData; break; case TYPE_ASSEMBLY_HARD: m_auiHardBoss[2] = uiData; break; case TYPE_MIMIRON_HARD: m_auiHardBoss[3] = uiData; if(uiData == DONE) { if (instance->IsRegularDifficulty()) { DoRespawnGameObject(GO_CACHE_OF_INOV_HARD, 30*MINUTE); } else { DoRespawnGameObject(GO_CACHE_OF_INOV_HARD_H, 30*MINUTE); } } break; case TYPE_HODIR_HARD: m_auiHardBoss[4] = uiData; if(uiData == DONE) { if (instance->IsRegularDifficulty()) { DoRespawnGameObject(GO_CACHE_OF_RARE_WINTER, 30*MINUTE); } else { DoRespawnGameObject(GO_CACHE_OF_RARE_WINTER_H, 30*MINUTE); } } break; case TYPE_THORIM_HARD: m_auiHardBoss[5] = uiData; if(uiData == DONE) { if (instance->IsRegularDifficulty()) { DoRespawnGameObject(GO_CACHE_OF_RARE_STORMS, 30*MINUTE); } else { DoRespawnGameObject(GO_CACHE_OF_RARE_STORMS_H, 30*MINUTE); } } break; case TYPE_FREYA_HARD: m_auiHardBoss[6] = uiData; if(uiData == DONE) { if (instance->IsRegularDifficulty()) { DoRespawnGameObject(GO_FREYA_GIFT_HARD, 30*MINUTE); } else { DoRespawnGameObject(GO_FREYA_GIFT_HARD_H, 30*MINUTE); } } break; case TYPE_VEZAX_HARD: m_auiHardBoss[7] = uiData; break; case TYPE_YOGGSARON_HARD: m_auiHardBoss[8] = uiData; break; // Ulduar keepers case TYPE_KEEPER_HODIR: m_auiUlduarKeepers[0] = uiData; break; case TYPE_KEEPER_THORIM: m_auiUlduarKeepers[1] = uiData; break; case TYPE_KEEPER_FREYA: m_auiUlduarKeepers[2] = uiData; break; case TYPE_KEEPER_MIMIRON: m_auiUlduarKeepers[3] = uiData; break; // teleporters case TYPE_LEVIATHAN_TP: m_auiUlduarTeleporters[0] = uiData; break; case TYPE_XT002_TP: m_auiUlduarTeleporters[1] = uiData; break; case TYPE_MIMIRON_TP: m_auiUlduarTeleporters[2] = uiData; break; // mini boss case TYPE_RUNIC_COLOSSUS: m_auiMiniBoss[0] = uiData; if (uiData == DONE) OpenDoor(GO_RUNED_STONE_DOOR); else CloseDoor(GO_RUNED_STONE_DOOR); break; case TYPE_RUNE_GIANT: m_auiMiniBoss[1] = uiData; if (uiData == DONE) OpenDoor(GO_THORIM_STONE_DOOR); else CloseDoor(GO_THORIM_STONE_DOOR); break; case TYPE_LEVIATHAN_MK: m_auiMiniBoss[2] = uiData; break; case TYPE_VX001: m_auiMiniBoss[3] = uiData; /*if (uiData == DONE) // just for animation :) { for(uint8 i = 0; i < 9; i++) DoUseDoorOrButton(m_uiMimironTelGUID[i]); }*/ break; case TYPE_AERIAL_UNIT: m_auiMiniBoss[4] = uiData; break; case TYPE_YOGG_BRAIN: m_auiMiniBoss[5] = uiData; break; //phases case TYPE_MIMIRON_PHASE: m_uiMimironPhase = uiData; break; case TYPE_YOGG_PHASE: m_uiYoggPhase = uiData; break; case TYPE_VISION_PHASE: m_uiVisionPhase = uiData; break; } if (uiData == DONE || uiData == FAIL) { OUT_SAVE_INST_DATA; // save all encounters, hard bosses and keepers 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_auiHardBoss[0] << " " << m_auiHardBoss[1] << " " << m_auiHardBoss[2] << " " << m_auiHardBoss[2] << " " << m_auiHardBoss[4] << " " << m_auiHardBoss[5] << " " << m_auiHardBoss[6] << " " << m_auiHardBoss[7] << " " << m_auiHardBoss[8] << " " << m_auiUlduarKeepers[0] << " " << m_auiUlduarKeepers[1] << " " << m_auiUlduarKeepers[2] << " " << m_auiUlduarKeepers[3] << " " << m_auiUlduarTeleporters[0] << " " << m_auiUlduarTeleporters[1] << " " << m_auiUlduarTeleporters[2]; m_strInstData = saveStream.str(); SaveToDB(); OUT_SAVE_INST_DATA_COMPLETE; } }
void instance_ulduar::SetData(uint32 uiType, uint32 uiData) { switch (uiType) { case TYPE_LEVIATHAN: m_auiEncounter[uiType] = uiData; DoUseDoorOrButton(GO_SHIELD_WALL); if (uiData == DONE) { DoUseDoorOrButton(GO_XT002_GATE); DoUseDoorOrButton(GO_LIGHTNING_FIELD); } break; case TYPE_IGNIS: m_auiEncounter[uiType] = uiData; break; case TYPE_RAZORSCALE: m_auiEncounter[uiType] = uiData; break; case TYPE_XT002: m_auiEncounter[uiType] = uiData; DoUseDoorOrButton(GO_XT002_GATE); break; case TYPE_ASSEMBLY: // Don't set the same encounter data twice if (uiData == m_auiEncounter[uiType]) return; m_auiEncounter[uiType] = uiData; // don't continue for encounter = special if (uiData == SPECIAL) return; DoUseDoorOrButton(GO_IRON_ENTRANCE_DOOR); if (uiData == DONE) DoUseDoorOrButton(GO_ARCHIVUM_DOOR); else if (uiData == IN_PROGRESS) { SetSpecialAchievementCriteria(TYPE_ACHIEV_BRUNDIR, true); SetSpecialAchievementCriteria(TYPE_ACHIEV_MOLGEIM, true); SetSpecialAchievementCriteria(TYPE_ACHIEV_STEELBREAKER, true); SetSpecialAchievementCriteria(TYPE_ACHIEV_STUNNED, true); } break; case TYPE_KOLOGARN: m_auiEncounter[uiType] = uiData; DoUseDoorOrButton(GO_SHATTERED_DOOR); if (uiData == DONE) { DoRespawnGameObject(instance->IsRegularDifficulty() ? GO_CACHE_OF_LIVING_STONE_10 : GO_CACHE_OF_LIVING_STONE_25, 30*MINUTE); if (GameObject* pBridge = GetSingleGameObjectFromStorage(GO_KOLOGARN_BRIDGE)) pBridge->SetGoState(GO_STATE_READY); } break; case TYPE_AURIAYA: m_auiEncounter[uiType] = uiData; if (uiData == IN_PROGRESS) { SetSpecialAchievementCriteria(TYPE_ACHIEV_CAT_LADY, true); SetSpecialAchievementCriteria(TYPE_ACHIEV_NINE_LIVES, false); } break; // Keepers case TYPE_MIMIRON: m_auiEncounter[uiType] = uiData; DoUseDoorOrButton(GO_MIMIRON_DOOR_1); DoUseDoorOrButton(GO_MIMIRON_DOOR_2); DoUseDoorOrButton(GO_MIMIRON_DOOR_3); if (uiData == DONE) { if (GetData(TYPE_MIMIRON_HARD) != DONE) DoRespawnGameObject(instance->IsRegularDifficulty() ? GO_CACHE_OF_INOV_10 : GO_CACHE_OF_INOV_25, 30*MINUTE); SpawnFriendlyKeeper(NPC_MIMIRON_IMAGE); } break; case TYPE_HODIR: m_auiEncounter[uiType] = uiData; DoUseDoorOrButton(GO_HODIR_ENTER); if (uiData == DONE) { DoUseDoorOrButton(GO_HODIR_ICE_WALL); DoUseDoorOrButton(GO_HODIR_EXIT); DoRespawnGameObject(instance->IsRegularDifficulty() ? GO_CACHE_OF_WINTER_10 : GO_CACHE_OF_WINTER_25, 30*MINUTE); SpawnFriendlyKeeper(NPC_HODIR_IMAGE); } break; case TYPE_THORIM: m_auiEncounter[uiType] = uiData; DoUseDoorOrButton(GO_LIGHTNING_FIELD); if (uiData == IN_PROGRESS) DoUseDoorOrButton(GO_DARK_IRON_PORTCULIS); if (uiData == DONE) { if (GetData(TYPE_THORIM_HARD) != DONE) DoRespawnGameObject(instance->IsRegularDifficulty() ? GO_CACHE_OF_STORMS_10 : GO_CACHE_OF_STORMS_25, 30*MINUTE); SpawnFriendlyKeeper(NPC_THORIM_IMAGE); } break; case TYPE_FREYA: m_auiEncounter[uiType] = uiData; if (uiData == DONE) SpawnFriendlyKeeper(NPC_FREYA_IMAGE); break; // Prison case TYPE_VEZAX: m_auiEncounter[uiType] = uiData; if (uiData == DONE) DoUseDoorOrButton(GO_VEZAX_GATE); break; case TYPE_YOGGSARON: m_auiEncounter[uiType] = uiData; DoUseDoorOrButton(GO_YOGG_GATE); break; // Celestial Planetarium case TYPE_ALGALON: m_auiEncounter[uiType] = uiData; //TODO: need to find the proper way to use these DoUseDoorOrButton(GO_CELESTIAL_DOOR); DoUseDoorOrButton(GO_UNIVERSE_FLOOR_CELESTIAL); if (uiData == DONE) DoRespawnGameObject(instance->IsRegularDifficulty() ? GO_GIFT_OF_OBSERVER_10 : GO_GIFT_OF_OBSERVER_25, 30*MINUTE); break; // Hard modes case TYPE_LEVIATHAN_HARD: m_auiHardBoss[0] = uiData; // TODO: add extra loot break; case TYPE_XT002_HARD: m_auiHardBoss[1] = uiData; // TODO: add extra loot break; case TYPE_HODIR_HARD: m_auiHardBoss[2] = uiData; if (uiData == DONE) DoRespawnGameObject(instance->IsRegularDifficulty() ? GO_CACHE_OF_RARE_WINTER_10 : GO_CACHE_OF_RARE_WINTER_25, 30*MINUTE); break; case TYPE_THORIM_HARD: m_auiHardBoss[3] = uiData; if (uiData == DONE) DoRespawnGameObject(instance->IsRegularDifficulty() ? GO_CACHE_OF_STORMS_10_H : GO_CACHE_OF_STORMS_25_H, 30*MINUTE); break; case TYPE_MIMIRON_HARD: m_auiHardBoss[4] = uiData; if (uiData == DONE) DoRespawnGameObject(instance->IsRegularDifficulty() ? GO_CACHE_OF_INOV_10_H : GO_CACHE_OF_INOV_25_H, 30*MINUTE); break; case TYPE_VEZAX_HARD: m_auiHardBoss[5] = uiData; // TODO: add extra loot break; case TYPE_YOGGSARON_HARD: m_auiHardBoss[6] = uiData; // TODO: add extra loot break; // Ulduar keepers case TYPE_KEEPER_HODIR: m_auiUlduarKeepers[0] = uiData; break; case TYPE_KEEPER_THORIM: m_auiUlduarKeepers[1] = uiData; break; case TYPE_KEEPER_FREYA: m_auiUlduarKeepers[2] = uiData; break; case TYPE_KEEPER_MIMIRON: m_auiUlduarKeepers[3] = uiData; break; } DoOpenMadnessDoorIfCan(); if (uiData == DONE || uiData == FAIL) { OUT_SAVE_INST_DATA; // Save all encounters, hard bosses, keepers and teleporters 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_auiHardBoss[0] << " " << m_auiHardBoss[1] << " " << m_auiHardBoss[2] << " " << m_auiHardBoss[2] << " " << m_auiHardBoss[4] << " " << m_auiHardBoss[5] << " " << m_auiHardBoss[6] << " " << m_auiUlduarKeepers[0] << " " << m_auiUlduarKeepers[1] << " " << m_auiUlduarKeepers[2] << " " << m_auiUlduarKeepers[3]; m_strInstData = saveStream.str(); SaveToDB(); OUT_SAVE_INST_DATA_COMPLETE; } }
void instance_ulduar::OnObjectCreate(GameObject* pGo) { switch(pGo->GetEntry()) { // ----------------- Doors & Other ----------------- // The siege case GO_SHIELD_WALL: break; case GO_LEVIATHAN_GATE: if (m_auiEncounter[TYPE_LEVIATHAN] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_XT002_GATE: pGo->SetGoState(GO_STATE_READY); if (m_auiEncounter[TYPE_XT002] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); if (m_auiEncounter[TYPE_LEVIATHAN] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_BROKEN_HARPOON: pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NO_INTERACT); break; // Archivum case GO_IRON_ENTRANCE_DOOR: break; case GO_ARCHIVUM_DOOR: if (m_auiEncounter[TYPE_ASSEMBLY]) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_ARCHIVUM_CONSOLE: case GO_UNIVERSE_FLOOR_ARCHIVUM: // Celestial Planetarium case GO_CELESTIAL_ACCES: case GO_CELESTIAL_DOOR: case GO_UNIVERSE_FLOOR_CELESTIAL: case GO_AZEROTH_GLOBE: break; // Shattered Hallway case GO_KOLOGARN_BRIDGE: pGo->SetGoState(GO_STATE_ACTIVE); if (m_auiEncounter[TYPE_KOLOGARN] == DONE) pGo->SetGoState(GO_STATE_READY); break; case GO_SHATTERED_DOOR: break; // ----------------- The Keepers ----------------- // Hodir case GO_HODIR_EXIT: if (m_auiEncounter[TYPE_HODIR]) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_HODIR_ICE_WALL: if (m_auiEncounter[TYPE_HODIR]) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_HODIR_ENTER: break; // Mimiron case G0_MIMIRON_BUTTON: if (m_auiEncounter[TYPE_MIMIRON] == NOT_STARTED) pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NO_INTERACT); break; case GO_MIMIRON_DOOR_1: case GO_MIMIRON_DOOR_2: case GO_MIMIRON_DOOR_3: case GO_MIMIRON_ELEVATOR: case GO_MIMIRON_TEL1: case GO_MIMIRON_TEL2: case GO_MIMIRON_TEL3: case GO_MIMIRON_TEL4: case GO_MIMIRON_TEL5: case GO_MIMIRON_TEL6: case GO_MIMIRON_TEL7: case GO_MIMIRON_TEL8: case GO_MIMIRON_TEL9: // Thorim case GO_DARK_IRON_PORTCULIS: case GO_RUNED_STONE_DOOR: case GO_THORIM_STONE_DOOR: case GO_LIGHTNING_FIELD: break; case GO_DOOR_LEVER: pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NO_INTERACT); break; // Prison case GO_ANCIENT_GATE: DoOpenMadnessDoorIfCan(); break; case GO_VEZAX_GATE: pGo->SetGoState(GO_STATE_READY); if (m_auiEncounter[TYPE_VEZAX]) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_YOGG_GATE: case GO_BRAIN_DOOR1: case GO_BRAIN_DOOR2: case GO_BRAIN_DOOR3: break; // ----------------- Chests ----------------- // Kologarn case GO_CACHE_OF_LIVING_STONE_10: case GO_CACHE_OF_LIVING_STONE_25: // Hodir case GO_CACHE_OF_WINTER_10: case GO_CACHE_OF_WINTER_25: case GO_CACHE_OF_RARE_WINTER_10: case GO_CACHE_OF_RARE_WINTER_25: // Thorim case GO_CACHE_OF_STORMS_10: case GO_CACHE_OF_STORMS_25: case GO_CACHE_OF_STORMS_10_H: case GO_CACHE_OF_STORMS_25_H: // Mimiron case GO_CACHE_OF_INOV_10: case GO_CACHE_OF_INOV_25: case GO_CACHE_OF_INOV_10_H: case GO_CACHE_OF_INOV_25_H: // Alagon case GO_GIFT_OF_OBSERVER_10: case GO_GIFT_OF_OBSERVER_25: break; default: return; } m_mGoEntryGuidStore[pGo->GetEntry()] = pGo->GetObjectGuid(); }
void instance_ulduar::SetData(uint32 uiType, uint32 uiData) { switch (uiType) { // Siege of Ulduar case TYPE_LEVIATHAN: m_auiEncounter[uiType] = uiData; if (uiData != SPECIAL) DoUseDoorOrButton(GO_SHIELD_WALL); if (uiData == IN_PROGRESS) { // make sure that the Lightning door is closed when engaged in combat if (GameObject* pDoor = GetSingleGameObjectFromStorage(GO_LIGHTNING_DOOR)) { if (pDoor->GetGoState() != GO_STATE_READY) DoUseDoorOrButton(GO_LIGHTNING_DOOR); } SetSpecialAchievementCriteria(TYPE_ACHIEV_SHUTOUT, true); } else if (uiData == DONE) { DoUseDoorOrButton(GO_XT002_GATE); DoUseDoorOrButton(GO_LIGHTNING_DOOR); } else if (uiData == FAIL) DoCallLeviathanHelp(); break; case TYPE_IGNIS: m_auiEncounter[uiType] = uiData; if (uiData == IN_PROGRESS) { DoStartTimedAchievement(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, ACHIEV_START_IGNIS_ID); SetSpecialAchievementCriteria(TYPE_ACHIEV_SHATTERED, false); } break; case TYPE_RAZORSCALE: if (uiData == IN_PROGRESS) SetSpecialAchievementCriteria(TYPE_ACHIEV_QUICK_SHAVE, true); else if (uiData == FAIL) { // reset the commander if (Creature* pCommander = GetSingleCreatureFromStorage(NPC_EXPEDITION_COMMANDER)) pCommander->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); // reset all creatures for (GuidList::const_iterator itr = m_lDefendersGuids.begin(); itr != m_lDefendersGuids.end(); ++itr) { if (Creature* pDefender = instance->GetCreature(*itr)) { if (!pDefender->isAlive()) pDefender->Respawn(); else pDefender->GetMotionMaster()->MoveTargetedHome(); } } for (GuidList::const_iterator itr = m_lEngineersGuids.begin(); itr != m_lEngineersGuids.end(); ++itr) { if (Creature* pEngineer = instance->GetCreature(*itr)) { if (!pEngineer->isAlive()) pEngineer->Respawn(); else pEngineer->GetMotionMaster()->MoveTargetedHome(); } } for (GuidList::const_iterator itr = m_lTrappersGuids.begin(); itr != m_lTrappersGuids.end(); ++itr) { if (Creature* pTrapper = instance->GetCreature(*itr)) { if (!pTrapper->isAlive()) pTrapper->Respawn(); else pTrapper->GetMotionMaster()->MoveTargetedHome(); } } for (GuidList::const_iterator itr = m_lHarpoonDummyGuids.begin(); itr != m_lHarpoonDummyGuids.end(); ++itr) { if (Creature* pHarpoon = instance->GetCreature(*itr)) pHarpoon->InterruptNonMeleeSpells(false); } // reset Harpoons: respawn the broken ones and despawn the repaired ones for (GuidVector::const_iterator itr = m_vBrokenHarpoonsGuids.begin(); itr != m_vBrokenHarpoonsGuids.end(); ++itr) { if (GameObject* pHarpoon = instance->GetGameObject(*itr)) { if (!pHarpoon->isSpawned()) pHarpoon->Respawn(); } } for (GuidList::const_iterator itr = m_lRepairedHarpoonsGuids.begin(); itr != m_lRepairedHarpoonsGuids.end(); ++itr) { if (GameObject* pHarpoon = instance->GetGameObject(*itr)) { if (pHarpoon->isSpawned()) pHarpoon->SetLootState(GO_JUST_DEACTIVATED); } } } m_auiEncounter[uiType] = uiData; break; case TYPE_XT002: m_auiEncounter[uiType] = uiData; DoUseDoorOrButton(GO_XT002_GATE); if (uiData == IN_PROGRESS) { DoStartTimedAchievement(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, ACHIEV_START_XT002_ID); SetSpecialAchievementCriteria(TYPE_ACHIEV_NERF_ENG, true); } break; // Antechamber of Ulduar case TYPE_ASSEMBLY: // Don't set the same encounter data twice if (uiData == m_auiEncounter[uiType]) return; m_auiEncounter[uiType] = uiData; // don't continue for encounter = special if (uiData == SPECIAL) return; DoUseDoorOrButton(GO_IRON_ENTRANCE_DOOR); if (uiData == DONE) { DoUseDoorOrButton(GO_ARCHIVUM_DOOR); if (Player* pPlayer = GetPlayerInMap()) { pPlayer->SummonCreature(NPC_BRANN_ARCHIVUM, afBrannArchivumSpawnPos[0], afBrannArchivumSpawnPos[1], afBrannArchivumSpawnPos[2], afBrannArchivumSpawnPos[3], TEMPSUMMON_DEAD_DESPAWN, 0, true); pPlayer->SummonCreature(instance->IsRegularDifficulty() ? NPC_PROSPECTOR_DOREN : NPC_PROSPECTOR_DOREN_H, afProspectorSpawnPos[0], afProspectorSpawnPos[1], afProspectorSpawnPos[2], afProspectorSpawnPos[3], TEMPSUMMON_DEAD_DESPAWN, 0, true); } } else if (uiData == IN_PROGRESS) { SetSpecialAchievementCriteria(TYPE_ACHIEV_BRUNDIR, true); SetSpecialAchievementCriteria(TYPE_ACHIEV_MOLGEIM, true); SetSpecialAchievementCriteria(TYPE_ACHIEV_STEELBREAKER, true); SetSpecialAchievementCriteria(TYPE_ACHIEV_STUNNED, true); } break; case TYPE_KOLOGARN: m_auiEncounter[uiType] = uiData; if (uiData == DONE) { DoRespawnGameObject(instance->IsRegularDifficulty() ? GO_CACHE_OF_LIVING_STONE_10 : GO_CACHE_OF_LIVING_STONE_25, 30 * MINUTE); DoUseDoorOrButton(GO_KOLOGARN_BRIDGE); } else if (uiData == IN_PROGRESS) { SetSpecialAchievementCriteria(TYPE_ACHIEV_RUBBLE, false); SetSpecialAchievementCriteria(TYPE_ACHIEV_DISARMED, false); SetSpecialAchievementCriteria(TYPE_ACHIEV_LOOKS_KILL, true); SetSpecialAchievementCriteria(TYPE_ACHIEV_OPEN_ARMS, true); } break; case TYPE_AURIAYA: m_auiEncounter[uiType] = uiData; if (uiData == IN_PROGRESS) { SetSpecialAchievementCriteria(TYPE_ACHIEV_CAT_LADY, true); SetSpecialAchievementCriteria(TYPE_ACHIEV_NINE_LIVES, false); } break; // Keepers of Ulduar case TYPE_MIMIRON: m_auiEncounter[uiType] = uiData; DoUseDoorOrButton(GO_MIMIRON_DOOR_1); DoUseDoorOrButton(GO_MIMIRON_DOOR_2); DoUseDoorOrButton(GO_MIMIRON_DOOR_3); if (uiData == DONE) { if (GetData(TYPE_MIMIRON_HARD) != DONE) DoRespawnGameObject(instance->IsRegularDifficulty() ? GO_CACHE_OF_INOV_10 : GO_CACHE_OF_INOV_25, 30 * MINUTE); SpawnFriendlyKeeper(NPC_KEEPER_MIMIRON); DoOpenMadnessDoorIfCan(); } break; case TYPE_HODIR: m_auiEncounter[uiType] = uiData; DoUseDoorOrButton(GO_HODIR_ENTER); if (uiData == DONE) { DoUseDoorOrButton(GO_HODIR_ICE_WALL); DoUseDoorOrButton(GO_HODIR_EXIT); DoToggleGameObjectFlags(instance->IsRegularDifficulty() ? GO_CACHE_OF_WINTER_10 : GO_CACHE_OF_WINTER_25, GO_FLAG_NO_INTERACT, false); if (GetData(TYPE_HODIR_HARD) == DONE) DoToggleGameObjectFlags(instance->IsRegularDifficulty() ? GO_CACHE_OF_RARE_WINTER_10 : GO_CACHE_OF_RARE_WINTER_25, GO_FLAG_NO_INTERACT, false); SpawnFriendlyKeeper(NPC_KEEPER_HODIR); DoOpenMadnessDoorIfCan(); } else if (uiData == FAIL) { if (GameObject* pChest = GetSingleGameObjectFromStorage(instance->IsRegularDifficulty() ? GO_CACHE_OF_RARE_WINTER_10 : GO_CACHE_OF_RARE_WINTER_25)) pChest->Respawn(); if (Player* pPlayer = GetPlayerInMap()) DoSpawnHodirNpcs(pPlayer); SetData(TYPE_HODIR_HARD, FAIL); } else if (uiData == IN_PROGRESS) { SetSpecialAchievementCriteria(TYPE_ACHIEV_CHEESE_FREEZE, true); SetSpecialAchievementCriteria(TYPE_ACHIEV_COOL_FRIENDS, true); } break; case TYPE_THORIM: m_auiEncounter[uiType] = uiData; DoUseDoorOrButton(GO_LIGHTNING_FIELD); if (uiData == IN_PROGRESS) DoToggleGameObjectFlags(GO_DOOR_LEVER, GO_FLAG_NO_INTERACT, false); else if (uiData == DONE) { if (GetData(TYPE_THORIM_HARD) == DONE) { DoRespawnGameObject(instance->IsRegularDifficulty() ? GO_CACHE_OF_STORMS_10_H : GO_CACHE_OF_STORMS_25_H, 30 * MINUTE); DoToggleGameObjectFlags(instance->IsRegularDifficulty() ? GO_CACHE_OF_STORMS_10_H : GO_CACHE_OF_STORMS_25_H, GO_FLAG_NO_INTERACT, false); } else { DoRespawnGameObject(instance->IsRegularDifficulty() ? GO_CACHE_OF_STORMS_10 : GO_CACHE_OF_STORMS_25, 30 * MINUTE); DoToggleGameObjectFlags(instance->IsRegularDifficulty() ? GO_CACHE_OF_STORMS_10 : GO_CACHE_OF_STORMS_25, GO_FLAG_NO_INTERACT, false); } SpawnFriendlyKeeper(NPC_KEEPER_THORIM); DoOpenMadnessDoorIfCan(); } else if (uiData == FAIL) { DoToggleGameObjectFlags(GO_DOOR_LEVER, GO_FLAG_NO_INTERACT, true); if (GameObject* pDoor = GetSingleGameObjectFromStorage(GO_RUNED_STONE_DOOR)) pDoor->ResetDoorOrButton(); if (GameObject* pDoor = GetSingleGameObjectFromStorage(GO_THORIM_STONE_DOOR)) pDoor->ResetDoorOrButton(); if (Player* pPlayer = GetPlayerInMap()) DoSpawnThorimNpcs(pPlayer); m_uiSlayedArenaMobs = 0; } break; case TYPE_FREYA: m_auiEncounter[uiType] = uiData; if (uiData == DONE) { SpawnFriendlyKeeper(NPC_KEEPER_FREYA); DoOpenMadnessDoorIfCan(); } break; // Ulduar Prison case TYPE_VEZAX: m_auiEncounter[uiType] = uiData; if (uiData == DONE) DoUseDoorOrButton(GO_VEZAX_GATE); break; case TYPE_YOGGSARON: m_auiEncounter[uiType] = uiData; DoUseDoorOrButton(GO_YOGG_GATE); break; // Celestial Planetarium case TYPE_ALGALON: m_auiEncounter[uiType] = uiData; if (uiData != SPECIAL) { // environment gameobjects DoUseDoorOrButton(GO_AZEROTH_GLOBE); DoUseDoorOrButton(GO_UNIVERSE_FLOOR); DoUseDoorOrButton(GO_UNIVERSE_FLOOR_COMBAT); DoUseDoorOrButton(GO_CELESTIAL_DOOR_COMBAT); } if (uiData == DONE) { DoUpdateWorldState(WORLD_STATE_TIMER, 0); DoRespawnGameObject(instance->IsRegularDifficulty() ? GO_GIFT_OF_OBSERVER_10 : GO_GIFT_OF_OBSERVER_25, 30 * MINUTE); } else if (uiData == FAIL) { // only despawn when time is over if (GetData(TYPE_ALGALON_TIMER) == 0) { DoUpdateWorldState(WORLD_STATE_TIMER, 0); if (Creature* pAlgalon = GetSingleCreatureFromStorage(NPC_ALGALON)) pAlgalon->AI()->SendAIEvent(AI_EVENT_CUSTOM_A, pAlgalon, pAlgalon); } } break; case TYPE_ALGALON_TIMER: m_auiEncounter[uiType] = uiData; DoUpdateWorldState(WORLD_STATE_TIMER_COUNT, m_auiEncounter[uiType]); break; // Hard modes (not saved) case TYPE_LEVIATHAN_HARD: m_auiHardBoss[0] = uiData; return; case TYPE_XT002_HARD: m_auiHardBoss[1] = uiData; return; case TYPE_HODIR_HARD: m_auiHardBoss[2] = uiData; return; case TYPE_THORIM_HARD: m_auiHardBoss[3] = uiData; return; case TYPE_MIMIRON_HARD: m_auiHardBoss[4] = uiData; return; case TYPE_VEZAX_HARD: m_auiHardBoss[5] = uiData; return; case TYPE_YOGGSARON_HARD: m_auiHardBoss[6] = uiData; return; // Ulduar keepers case TYPE_KEEPER_HODIR: m_auiUlduarKeepers[0] = uiData; break; case TYPE_KEEPER_THORIM: m_auiUlduarKeepers[1] = uiData; break; case TYPE_KEEPER_FREYA: m_auiUlduarKeepers[2] = uiData; break; case TYPE_KEEPER_MIMIRON: m_auiUlduarKeepers[3] = uiData; break; // Ulduar towers case TYPE_TOWER_HODIR: if (m_auiUlduarTowers[0] == uiData) return; if (uiData == FAIL) DoUseDoorOrButton(GO_HODIR_CRYSTAL); m_auiUlduarTowers[0] = uiData; break; case TYPE_TOWER_THORIM: if (m_auiUlduarTowers[1] == uiData) return; if (uiData == FAIL) DoUseDoorOrButton(GO_THORIM_CRYSTAL); m_auiUlduarTowers[1] = uiData; break; case TYPE_TOWER_FREYA: if (m_auiUlduarTowers[2] == uiData) return; if (uiData == FAIL) DoUseDoorOrButton(GO_FREYA_CRYSTAL); m_auiUlduarTowers[2] = uiData; break; case TYPE_TOWER_MIMIRON: if (m_auiUlduarTowers[3] == uiData) return; if (uiData == FAIL) DoUseDoorOrButton(GO_MIMIRON_CRYSTAL); m_auiUlduarTowers[3] = uiData; break; // Other types - not saved case TYPE_LEVIATHAN_GAUNTLET: m_uiGauntletStatus = uiData; return; } if (uiData == DONE || uiData == FAIL || uiData == SPECIAL || uiType == TYPE_ALGALON_TIMER) { OUT_SAVE_INST_DATA; // Save all encounters, hard bosses, keepers and teleporters 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_auiUlduarKeepers[0] << " " << m_auiUlduarKeepers[1] << " " << m_auiUlduarKeepers[2] << " " << m_auiUlduarKeepers[3] << " " << m_auiUlduarTowers[0] << " " << m_auiUlduarTowers[1] << " " << m_auiUlduarTowers[2] << " " << m_auiUlduarTowers[3]; m_strInstData = saveStream.str(); SaveToDB(); OUT_SAVE_INST_DATA_COMPLETE; } }
void instance_ulduar::SetData(uint32 uiType, uint32 uiData) { switch(uiType) { case TYPE_LEVIATHAN: m_auiEncounter[0] = uiData; DoUseDoorOrButton(m_uiShieldWallGUID); if (uiData == DONE) OpenDoor(m_uiLeviathanGateGUID); break; case TYPE_IGNIS: m_auiEncounter[1] = uiData; break; case TYPE_RAZORSCALE: m_auiEncounter[2] = uiData; break; case TYPE_XT002: m_auiEncounter[3] = uiData; if (uiData == DONE || uiData == FAIL) OpenDoor(m_uiXT002GateGUID); else if (uiData == IN_PROGRESS) CloseDoor(m_uiXT002GateGUID); break; case TYPE_ASSEMBLY: m_auiEncounter[4] = uiData; if (uiData == DONE) { OpenDoor(m_uiIronCouncilDoorGUID); OpenDoor(m_uiArchivumDoorGUID); OpenDoor(m_uiShatteredHallsDoorGUID); } else if (uiData == IN_PROGRESS) CloseDoor(m_uiIronCouncilDoorGUID); else if (uiData == FAIL) OpenDoor(m_uiIronCouncilDoorGUID); break; case TYPE_KOLOGARN: m_auiEncounter[5] = uiData; if (uiData == DONE) { DoRespawnGameObject(m_uiKologarnLootGUID, 30*MINUTE); if (GameObject* pGo = instance->GetGameObject(m_uiKologarnBridgeGUID)) { pGo->SetUInt32Value(GAMEOBJECT_LEVEL, 0); pGo->SetGoState(GO_STATE_READY); } } break; case TYPE_AURIAYA: m_auiEncounter[6] = uiData; if (uiData == DONE) { if (GameObject* pGO = instance->GetGameObject(m_uiMimironTramGUID)) { pGO->SetUInt32Value(GAMEOBJECT_LEVEL, 0); pGO->SetGoState(GO_STATE_READY); } } break; // Keepers case TYPE_MIMIRON: m_auiEncounter[7] = uiData; DoUseDoorOrButton(m_uiMimironDoor1GUID); DoUseDoorOrButton(m_uiMimironDoor2GUID); DoUseDoorOrButton(m_uiMimironDoor3GUID); if (uiData == DONE) { if(m_auiHardBoss[3] != DONE) DoRespawnGameObject(m_uiMimironLootGUID, 30*MINUTE); // used to make the friendly keeper visible if(Creature* pImage = instance->GetCreature(m_uiMimironImageGUID)) pImage->SetVisibility(VISIBILITY_ON); DoOpenMadnessDoorIfCan(); } break; case TYPE_HODIR: m_auiEncounter[8] = uiData; if (uiData == DONE) { OpenDoor(m_uiHodirEnterDoorGUID); DoUseDoorOrButton(m_uiHodirWallGUID); DoUseDoorOrButton(m_uiHodirExitDoorGUID); DoRespawnGameObject(m_uiHodirLootGUID, 30*MINUTE); // used to make the friendly keeper visible if(Creature* pImage = instance->GetCreature(m_uiHodirImageGUID)) pImage->SetVisibility(VISIBILITY_ON); DoOpenMadnessDoorIfCan(); } else if (uiData == IN_PROGRESS) CloseDoor(m_uiHodirEnterDoorGUID); else if (uiData == FAIL) OpenDoor(m_uiHodirEnterDoorGUID); break; case TYPE_THORIM: m_auiEncounter[9] = uiData; DoUseDoorOrButton(m_uiArenaEnterDoorGUID); if (uiData == IN_PROGRESS) DoUseDoorOrButton(m_uiArenaExitDoorGUID); if (uiData == DONE) { if(m_auiHardBoss[5] != DONE) DoRespawnGameObject(m_uiThorimLootGUID, 30*MINUTE); // used to make the friendly keeper visible if(Creature* pImage = instance->GetCreature(m_uiThorimImageGUID)) pImage->SetVisibility(VISIBILITY_ON); DoOpenMadnessDoorIfCan(); } break; case TYPE_FREYA: m_auiEncounter[10] = uiData; if (uiData == DONE) { // do this in order to see how many elders were alive and spawn the correct chest // hard mode drop if(m_auiHardBoss[6] == 3) DoRespawnGameObject(m_uiFreyaLootHardGUID, 30*MINUTE); // normal mode else DoRespawnGameObject(m_uiFreyaLootGUID, 30*MINUTE); // used to make the friendly keeper visible if(Creature* pImage = instance->GetCreature(m_uiFreyaImageGUID)) pImage->SetVisibility(VISIBILITY_ON); DoOpenMadnessDoorIfCan(); } break; // 1 elder up +1 emblem drops case TYPE_FREYA_1: m_auiFreyaElders[1] = uiData; break; // 2 elders up +2 emblems drop case TYPE_FREYA_2: m_auiFreyaElders[2] = uiData; break; // 3 elders up is TYPE_FREYA_HARD // Prison case TYPE_VEZAX: m_auiEncounter[11] = uiData; if (uiData == DONE) DoUseDoorOrButton(m_uiVezaxGateGUID); break; case TYPE_YOGGSARON: m_auiEncounter[12] = uiData; DoUseDoorOrButton(m_uiYoggGateGUID); break; // Celestial Planetarium case TYPE_ALGALON: m_auiEncounter[13] = uiData; DoUseDoorOrButton(m_uiCelestialDoorGUID); DoUseDoorOrButton(m_uiUniverseFloorCelestialGUID); if (uiData == DONE) DoRespawnGameObject(m_uiAlagonLootGUID, 30*MINUTE); break; // Hard modes case TYPE_LEVIATHAN_HARD: m_auiHardBoss[0] = uiData; break; case TYPE_XT002_HARD: m_auiHardBoss[1] = uiData; break; case TYPE_HODIR_HARD: m_auiHardBoss[4] = uiData; if(uiData == DONE) DoRespawnGameObject(m_uiHodirRareLootGUID, 30*MINUTE); break; case TYPE_ASSEMBLY_HARD: m_auiHardBoss[2] = uiData; break; case TYPE_FREYA_HARD: m_auiHardBoss[6] = uiData; break; case TYPE_THORIM_HARD: m_auiHardBoss[5] = uiData; if(uiData == DONE) DoRespawnGameObject(m_uiThorimRareLootGUID, 30*MINUTE); break; case TYPE_MIMIRON_HARD: m_auiHardBoss[3] = uiData; if(uiData == DONE) DoRespawnGameObject(m_uiMimironHardLootGUID, 30*MINUTE); break; case TYPE_VEZAX_HARD: m_auiHardBoss[7] = uiData; break; case TYPE_YOGGSARON_HARD: m_auiHardBoss[8] = uiData; break; // Ulduar keepers case TYPE_KEEPER_HODIR: m_auiUlduarKeepers[0] = uiData; break; case TYPE_KEEPER_THORIM: m_auiUlduarKeepers[1] = uiData; break; case TYPE_KEEPER_FREYA: m_auiUlduarKeepers[2] = uiData; break; case TYPE_KEEPER_MIMIRON: m_auiUlduarKeepers[3] = uiData; break; // teleporters case TYPE_LEVIATHAN_TP: m_auiUlduarTeleporters[0] = uiData; break; case TYPE_XT002_TP: m_auiUlduarTeleporters[1] = uiData; break; case TYPE_MIMIRON_TP: m_auiUlduarTeleporters[2] = uiData; break; // mini boss case TYPE_RUNIC_COLOSSUS: m_auiMiniBoss[0] = uiData; if (uiData == DONE) OpenDoor(m_uiHallwayDoorGUID); else CloseDoor(m_uiHallwayDoorGUID); break; case TYPE_RUNE_GIANT: m_auiMiniBoss[1] = uiData; if (uiData == DONE) OpenDoor(m_uiThorimEnterDoorGUID); else CloseDoor(m_uiThorimEnterDoorGUID); break; case TYPE_LEVIATHAN_MK: m_auiMiniBoss[2] = uiData; break; case TYPE_VX001: m_auiMiniBoss[3] = uiData; if (uiData == DONE) // just for animation :) { for(uint8 i = 0; i < 9; i++) DoUseDoorOrButton(m_uiMimironTelGUID[i]); } break; case TYPE_AERIAL_UNIT: m_auiMiniBoss[4] = uiData; break; case TYPE_YOGG_BRAIN: m_auiMiniBoss[5] = uiData; break; //phases case TYPE_MIMIRON_PHASE: m_uiMimironPhase = uiData; break; case TYPE_YOGG_PHASE: m_uiYoggPhase = uiData; break; case TYPE_VISION_PHASE: m_uiVisionPhase = uiData; break; // achievements case TYPE_ACHI_QUICK_SHAVE: m_bQuickShave = (uiData == DONE); break; case TYPE_ACHI_SHATTERED: m_bShattered = (uiData == DONE); break; case TYPE_ACHI_NERF_ENGI: m_bNerfEngi = (uiData == DONE); break; case TYPE_ACHI_NERF_GRAVITY: m_bNerfGravity = (uiData == DONE); break; case TYPE_ACHI_CHOOSE_MOLG: m_bChooseMolg = (uiData == DONE); break; case TYPE_ACHI_CHOOSE_BRUN: m_bChooseBrun = (uiData == DONE); break; case TYPE_ACHI_CHOOSE_STEEL: m_bChooseSteel = (uiData == DONE); break; case TYPE_ACHI_CANT_DO_THAT: m_bCantDoThat = (uiData == DONE); break; case TYPE_ACHI_OPEN_ARMS: m_bOpenArms = (uiData == DONE); break; case TYPE_ACHI_IF_LOOKS: m_bIfLooks = (uiData == DONE); break; case TYPE_ACHI_RUBBLE_ROLL: m_bRubbleRoll = (uiData == DONE); break; case TYPE_ACHI_CAT_LADY: m_bCatLady = (uiData == DONE); break; case TYPE_ACHI_NINE_LIVES: m_bNineLives = (uiData == DONE); break; } if (uiData == DONE || uiData == FAIL) { OUT_SAVE_INST_DATA; // save all encounters, hard bosses and keepers 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_auiHardBoss[0] << " " << m_auiHardBoss[1] << " " << m_auiHardBoss[2] << " " << m_auiHardBoss[2] << " " << m_auiHardBoss[4] << " " << m_auiHardBoss[5] << " " << m_auiHardBoss[6] << " " << m_auiHardBoss[7] << " " << m_auiHardBoss[8] << " " << m_auiUlduarKeepers[0] << " " << m_auiUlduarKeepers[1] << " " << m_auiUlduarKeepers[2] << " " << m_auiUlduarKeepers[3] << " " << m_auiUlduarTeleporters[0] << " " << m_auiUlduarTeleporters[1] << " " << m_auiUlduarTeleporters[2]; m_strInstData = saveStream.str(); SaveToDB(); OUT_SAVE_INST_DATA_COMPLETE; } }
void instance_ulduar::OnObjectCreate(GameObject *pGo) { switch(pGo->GetEntry()) { // doors & other // The siege case GO_SHIELD_WALL: m_uiShieldWallGUID = pGo->GetGUID(); break; case GO_LEVIATHAN_GATE: m_uiLeviathanGateGUID = pGo->GetGUID(); if(m_auiEncounter[0] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_XT002_GATE: pGo->SetGoState(GO_STATE_READY); if(m_auiEncounter[0] == DONE || m_auiEncounter[3] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); m_uiXT002GateGUID = pGo->GetGUID(); break; case GO_BROKEN_HARPOON: m_uiBrokenHarpoonGUID = pGo->GetGUID(); pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1); break; // Archivum case GO_IRON_ENTRANCE_DOOR: m_uiIronCouncilDoorGUID = pGo->GetGUID(); break; case GO_ARCHIVUM_DOOR: m_uiArchivumDoorGUID = pGo->GetGUID(); pGo->SetGoState(GO_STATE_READY); if(m_auiEncounter[4]) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_ARCHIVUM_CONSOLE: m_uiArchivumConsoleGUID = pGo->GetGUID(); break; case GO_UNIVERSE_FLOOR_ARCHIVUM: m_uiUniverseFloorArchivumGUID = pGo->GetGUID(); break; // Celestial Planetarium case GO_CELESTIAL_ACCES: m_uiCelestialConsoleGUID = pGo->GetGUID(); break; case GO_CELESTIAL_DOOR: m_uiCelestialDoorGUID = pGo->GetGUID(); break; case GO_UNIVERSE_FLOOR_CELESTIAL: m_uiUniverseFloorCelestialGUID = pGo->GetGUID(); break; case GO_AZEROTH_GLOBE: m_uiAzerothGlobeGUID = pGo->GetGUID(); break; // Shattered Hallway case GO_KOLOGARN_BRIDGE: m_uiKologarnBridgeGUID = pGo->GetGUID(); pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_SHATTERED_DOOR: m_uiShatteredHallsDoorGUID = pGo->GetGUID(); break; // The keepers // Hodir case GO_HODIR_EXIT: m_uiHodirExitDoorGUID = pGo->GetGUID(); if(m_auiEncounter[8] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_HODIR_ICE_WALL: m_uiHodirWallGUID = pGo->GetGUID(); if(m_auiEncounter[8] == DONE) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_HODIR_ENTER: m_uiHodirEnterDoorGUID = pGo->GetGUID(); pGo->SetGoState(GO_STATE_ACTIVE); break; // Mimiron case GO_MIMIRON_TRAM: m_uiMimironTramGUID = pGo->GetGUID(); if (m_auiEncounter[6] == DONE) { pGo->SetUInt32Value(GAMEOBJECT_LEVEL, 0); pGo->SetGoState(GO_STATE_READY); } break; case GO_MIMIRON_BUTTON: m_uiMimironButtonGUID = pGo->GetGUID(); if (m_auiEncounter[7] == NOT_STARTED) pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1); break; case GO_MIMIRON_DOOR_1: m_uiMimironDoor1GUID = pGo->GetGUID(); break; case GO_MIMIRON_DOOR_2: m_uiMimironDoor2GUID = pGo->GetGUID(); break; case GO_MIMIRON_DOOR_3: m_uiMimironDoor3GUID = pGo->GetGUID(); break; case GO_MIMIRON_ELEVATOR: m_uiMimironElevatorGUID = pGo->GetGUID(); break; case GO_MIMIRON_TEL1: m_uiMimironTelGUID[0] = pGo->GetGUID(); break; case GO_MIMIRON_TEL2: m_uiMimironTelGUID[1] = pGo->GetGUID(); break; case GO_MIMIRON_TEL3: m_uiMimironTelGUID[2] = pGo->GetGUID(); break; case GO_MIMIRON_TEL4: m_uiMimironTelGUID[3] = pGo->GetGUID(); break; case GO_MIMIRON_TEL5: m_uiMimironTelGUID[4] = pGo->GetGUID(); break; case GO_MIMIRON_TEL6: m_uiMimironTelGUID[5] = pGo->GetGUID(); break; case GO_MIMIRON_TEL7: m_uiMimironTelGUID[6] = pGo->GetGUID(); break; case GO_MIMIRON_TEL8: m_uiMimironTelGUID[7] = pGo->GetGUID(); break; case GO_MIMIRON_TEL9: m_uiMimironTelGUID[8] = pGo->GetGUID(); break; // Thorim case GO_DARK_IRON_PORTCULIS: m_uiArenaExitDoorGUID = pGo->GetGUID(); break; case GO_RUNED_STONE_DOOR: m_uiHallwayDoorGUID = pGo->GetGUID(); break; case GO_THORIM_STONE_DOOR: m_uiThorimEnterDoorGUID = pGo->GetGUID(); break; case GO_LIGHTNING_FIELD: m_uiArenaEnterDoorGUID = pGo->GetGUID(); break; case GO_DOOR_LEVER: m_uiThorimLeverGUID = pGo->GetGUID(); pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1); break; // Prison case GO_ANCIENT_GATE: m_uiAncientGateGUID = pGo->GetGUID(); DoOpenMadnessDoorIfCan(); break; case GO_VEZAX_GATE: m_uiVezaxGateGUID = pGo->GetGUID(); pGo->SetGoState(GO_STATE_READY); if(m_auiEncounter[11]) pGo->SetGoState(GO_STATE_ACTIVE); break; case GO_YOGG_GATE: m_uiYoggGateGUID = pGo->GetGUID(); break; case GO_BRAIN_DOOR1: m_uiBrainDoor1GUID = pGo->GetGUID(); break; case GO_BRAIN_DOOR2: m_uiBrainDoor2GUID = pGo->GetGUID(); break; case GO_BRAIN_DOOR3: m_uiBrainDoor3GUID = pGo->GetGUID(); break; // loot // Kologarn case GO_CACHE_OF_LIVING_STONE: m_uiKologarnLootGUID = pGo->GetGUID(); break; case GO_CACHE_OF_LIVING_STONE_H: m_uiKologarnLootGUID = pGo->GetGUID(); break; // Hodir case GO_CACHE_OF_WINTER: m_uiHodirLootGUID = pGo->GetGUID(); break; case GO_CACHE_OF_WINTER_H: m_uiHodirLootGUID = pGo->GetGUID(); break; // Hodir rare case GO_CACHE_OF_RARE_WINTER: m_uiHodirRareLootGUID = pGo->GetGUID(); break; case GO_CACHE_OF_RARE_WINTER_H: m_uiHodirRareLootGUID = pGo->GetGUID(); break; // Freya case GO_FREYA_GIFT: m_uiFreyaLootGUID = pGo->GetGUID(); break; case GO_FREYA_GIFT_H: m_uiFreyaLootGUID = pGo->GetGUID(); break; // Freya hard modes case GO_FREYA_GIFT_HARD: m_uiFreyaLootHardGUID = pGo->GetGUID(); break; case GO_FREYA_GIFT_H_HARD: m_uiFreyaLootHardGUID = pGo->GetGUID(); break; // Thorim case GO_CACHE_OF_STORMS: m_uiThorimLootGUID = pGo->GetGUID(); break; case GO_CACHE_OF_STORMS_H: m_uiThorimLootGUID = pGo->GetGUID(); break; // Thorim rare case GO_CACHE_OF_RARE_STORMS: m_uiThorimRareLootGUID = pGo->GetGUID(); break; case GO_CACHE_OF_RARE_STORMS_H: m_uiThorimRareLootGUID = pGo->GetGUID(); break; // Mimiron case GO_CACHE_OF_INOV: m_uiMimironLootGUID = pGo->GetGUID(); break; case GO_CACHE_OF_INOV_H: m_uiMimironLootGUID = pGo->GetGUID(); break; case GO_CACHE_OF_INOV_HARD: m_uiMimironHardLootGUID = pGo->GetGUID(); break; case GO_CACHE_OF_INOV_HARD_H: m_uiMimironHardLootGUID = pGo->GetGUID(); break; // Alagon case GO_GIFT_OF_OBSERVER: m_uiAlagonLootGUID = pGo->GetGUID(); break; case GO_GIFT_OF_OBSERVER_H: m_uiAlagonLootGUID = pGo->GetGUID(); break; } }