diff options
Diffstat (limited to 'src')
4 files changed, 79 insertions, 110 deletions
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_flame_leviathan.cpp index fc494e763d5..ab2b41ac9b3 100644 --- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_flame_leviathan.cpp +++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_flame_leviathan.cpp @@ -212,7 +212,6 @@ public: boss_flame_leviathanAI(Creature* pCreature) : BossAI(pCreature, TYPE_LEVIATHAN), vehicle(pCreature->GetVehicleKit()) { assert(vehicle); - pInstance = me->GetInstanceScript(); uiActiveTowers = 4; uiShutdown = 0; ActiveTowers = false; @@ -220,14 +219,13 @@ public: towerOfLife = false; towerOfFlames = false; towerOfFrost = false; + me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true); me->ApplySpellImmune(0, IMMUNITY_ID, 49560, true); //deathgrip me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_STUNNED); me->SetReactState(REACT_PASSIVE); } - InstanceScript* pInstance; - Vehicle* vehicle; uint8 uiActiveTowers; uint8 uiShutdown; @@ -240,7 +238,6 @@ public: void Reset() { _Reset(); - pInstance->SetData(TYPE_LEVIATHAN, NOT_STARTED); me->SetReactState(REACT_DEFENSIVE); InstallAdds(true); } @@ -248,7 +245,6 @@ public: void EnterCombat(Unit* /*who*/) { _EnterCombat(); - pInstance->SetData(TYPE_LEVIATHAN, IN_PROGRESS); me->SetReactState(REACT_AGGRESSIVE); events.ScheduleEvent(EVENT_PURSUE, 30*IN_MILLISECONDS); events.ScheduleEvent(EVENT_MISSILE, 1500); @@ -347,7 +343,6 @@ public: void JustDied(Unit* /*victim*/) { _JustDied(); - pInstance->SetData(TYPE_LEVIATHAN, DONE); //_Reset doesnt do this correctly DoScriptText(SAY_DEATH, me); if (ActiveTowers) @@ -355,13 +350,13 @@ public: switch (uiActiveTowers) { case 4: - pInstance->DoCompleteAchievement(RAID_MODE(ACHIEV_10_ORBIT_UARY, ACHIEV_25_ORBIT_UARY)); + instance->DoCompleteAchievement(RAID_MODE(ACHIEV_10_ORBIT_UARY, ACHIEV_25_ORBIT_UARY)); case 3: - pInstance->DoCompleteAchievement(RAID_MODE(ACHIEV_10_NUKED_FROM_ORBIT, ACHIEV_25_NUKED_FROM_ORBIT)); + instance->DoCompleteAchievement(RAID_MODE(ACHIEV_10_NUKED_FROM_ORBIT, ACHIEV_25_NUKED_FROM_ORBIT)); case 2: - pInstance->DoCompleteAchievement(RAID_MODE(ACHIEV_10_ORBITAL_DEVASTATION, ACHIEV_25_ORBITAL_DEVASTATION)); + instance->DoCompleteAchievement(RAID_MODE(ACHIEV_10_ORBITAL_DEVASTATION, ACHIEV_25_ORBITAL_DEVASTATION)); case 1: - pInstance->DoCompleteAchievement(RAID_MODE(ACHIEV_10_ORBITAL_BOMBARDMENT, ACHIEV_25_ORBITAL_BOMBARDMENT)); + instance->DoCompleteAchievement(RAID_MODE(ACHIEV_10_ORBITAL_BOMBARDMENT, ACHIEV_25_ORBITAL_BOMBARDMENT)); } } } @@ -751,10 +746,10 @@ public: { boss_flame_leviathan_overload_deviceAI(Creature* pCreature) : PassiveAI(pCreature) { - pInstance = pCreature->GetInstanceScript(); + instance = pCreature->GetInstanceScript(); } - InstanceScript *pInstance; + InstanceScript *instance; void DoAction(const int32 param) { @@ -922,24 +917,15 @@ public: { npc_colossusAI(Creature* pCreature) : ScriptedAI(pCreature) { - pInstance = pCreature->GetInstanceScript(); + instance = pCreature->GetInstanceScript(); } - InstanceScript *pInstance; + InstanceScript *instance; void JustDied(Unit* /*Who*/) { if (me->GetHomePosition().IsInDist(Center,50.f)) - { - if (pInstance) - pInstance->SetData(TYPE_COLOSSUS,pInstance->GetData(TYPE_COLOSSUS)+1); - - if (pInstance) - { - if (pInstance->GetData(TYPE_COLOSSUS == 2)) - pInstance->SetBossState(DATA_PRELEVIATHAN, DONE); // Unlocks the Teleport 2nd Location - } - } + instance->SetData(TYPE_COLOSSUS,instance->GetData(TYPE_COLOSSUS)+1); } void UpdateAI(const uint32 /*diff*/) @@ -1197,14 +1183,14 @@ public: bool OnGossipSelect(Player* pPlayer, Creature* pCreature, uint32 /*uiSender*/, uint32 uiAction) { pPlayer->PlayerTalkClass->ClearMenus(); - InstanceScript* pInstance = pCreature->GetInstanceScript(); + InstanceScript* instance = pCreature->GetInstanceScript(); switch(uiAction) { case GOSSIP_ACTION_INFO_DEF+1: if (pPlayer) { pPlayer->PrepareGossipMenu(pCreature); - pInstance->instance->LoadGrid(364,-16); //make sure leviathan is loaded + instance->instance->LoadGrid(364,-16); //make sure leviathan is loaded pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT,GOSSIP_ITEM_2,GOSSIP_SENDER_MAIN,GOSSIP_ACTION_INFO_DEF+2); @@ -1215,7 +1201,7 @@ public: if (pPlayer) pPlayer->CLOSE_GOSSIP_MENU(); - if (Creature* pLeviathan = pInstance->instance->GetCreature(pInstance->GetData64(TYPE_LEVIATHAN))) + if (Creature* pLeviathan = instance->instance->GetCreature(instance->GetData64(TYPE_LEVIATHAN))) { CAST_AI(boss_flame_leviathan::boss_flame_leviathanAI, (pLeviathan->AI()))->DoAction(0); //enable hard mode activating the 4 additional events spawning additional vehicles pCreature->SetVisibility(VISIBILITY_OFF); @@ -1236,8 +1222,8 @@ public: bool OnGossipHello(Player* pPlayer, Creature* pCreature) { - InstanceScript* pInstance = pCreature->GetInstanceScript(); - if (pInstance && pInstance->GetData(TYPE_LEVIATHAN) !=DONE && pPlayer) + InstanceScript* instance = pCreature->GetInstanceScript(); + if (instance && instance->GetData(TYPE_LEVIATHAN) !=DONE && pPlayer) { pPlayer->PrepareGossipMenu(pCreature); @@ -1256,10 +1242,10 @@ public: { npc_lorekeeperAI(Creature* pCreature) : ScriptedAI(pCreature) { - pInstance = pCreature->GetInstanceScript(); + instance = pCreature->GetInstanceScript(); } - InstanceScript* pInstance; + InstanceScript* instance; void DoAction(const int32 uiAction) { @@ -1314,8 +1300,8 @@ public: //} //bool OnGossipHello(Player* pPlayer, Creature* pCreature) //{ - // InstanceScript* pInstance = pCreature->GetInstanceScript(); - // if (pInstance && pInstance->GetData(TYPE_LEVIATHAN) !=DONE) + // InstanceScript* instance = pCreature->GetInstanceScript(); + // if (instance && instance->GetData(TYPE_LEVIATHAN) !=DONE) // { // pPlayer->PrepareGossipMenu(pCreature); // @@ -1335,22 +1321,22 @@ public: void OnDestroyed(Player* /*pPlayer*/, GameObject* pGO, uint32 /*value*/) { - InstanceScript* pInstance = pGO->GetInstanceScript(); + InstanceScript* instance = pGO->GetInstanceScript(); if (pGO->GetGOValue()->building.health == 0) { switch(pGO->GetEntry()) { case GO_TOWER_OF_STORMS: - pInstance->ProcessEvent(pGO, EVENT_TOWER_OF_STORM_DESTROYED); + instance->ProcessEvent(pGO, EVENT_TOWER_OF_STORM_DESTROYED); break; case GO_TOWER_OF_FLAMES: - pInstance->ProcessEvent(pGO, EVENT_TOWER_OF_FLAMES_DESTROYED); + instance->ProcessEvent(pGO, EVENT_TOWER_OF_FLAMES_DESTROYED); break; case GO_TOWER_OF_FROST: - pInstance->ProcessEvent(pGO, EVENT_TOWER_OF_FROST_DESTROYED); + instance->ProcessEvent(pGO, EVENT_TOWER_OF_FROST_DESTROYED); break; case GO_TOWER_OF_LIFE: - pInstance->ProcessEvent(pGO, EVENT_TOWER_OF_LIFE_DESTROYED); + instance->ProcessEvent(pGO, EVENT_TOWER_OF_LIFE_DESTROYED); break; } } diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp index 1345ec03d9f..056d5cfbbaf 100644 --- a/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp +++ b/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp @@ -74,6 +74,7 @@ public: void Initialize() { + SetBossNumber(MAX_ENCOUNTER); uiIgnisGUID = 0; uiRazorscaleGUID = 0; uiXT002GUID = 0; @@ -211,7 +212,6 @@ public: switch(uiEventId) { case EVENT_TOWER_OF_STORM_DESTROYED: - //pGO->GetInstanceScript()->SetData(DATA_TOWER_STORMS,DESTROYED); pFlameLeviathan->AI()->DoAction(1); break; case EVENT_TOWER_OF_FROST_DESTROYED: @@ -226,21 +226,15 @@ public: } } - void SetData(uint32 type, uint32 data) - { - switch(type) + bool SetBossState(uint32 type, EncounterState state) { - /*case TYPE_IGNIS: - case TYPE_RAZORSCALE: - case TYPE_XT002: - case TYPE_ASSEMBLY: - case TYPE_AURIAYA: - case TYPE_MIMIRON: - case TYPE_VEZAX: - case TYPE_YOGGSARON: - break;*/ + if (!InstanceScript::SetBossState(type, state)) + return false; + + switch (type) + { case TYPE_LEVIATHAN: - if (data == IN_PROGRESS) + if (state == IN_PROGRESS) { for (uint8 uiI = 0; uiI < 7; ++uiI) HandleGameObject(uiLeviathanDoor[uiI],false); @@ -251,26 +245,44 @@ public: HandleGameObject(uiLeviathanDoor[uiI],true); } break; + case TYPE_IGNIS: + case TYPE_RAZORSCALE: + case TYPE_XT002: + case TYPE_ASSEMBLY: + case TYPE_AURIAYA: + case TYPE_MIMIRON: + case TYPE_VEZAX: + case TYPE_YOGGSARON: + break; case TYPE_KOLOGARN: - if (data == DONE) + if (state == DONE) if (GameObject* pGO = instance->GetGameObject(uiKologarnChestGUID)) pGO->SetRespawnTime(pGO->GetRespawnDelay()); break; case TYPE_HODIR: - if (data == DONE) + if (state == DONE) if (GameObject* pGO = instance->GetGameObject(uiHodirChestGUID)) pGO->SetRespawnTime(pGO->GetRespawnDelay()); break; case TYPE_THORIM: - if (data == DONE) + if (state == DONE) if (GameObject* pGO = instance->GetGameObject(uiThorimChestGUID)) pGO->SetRespawnTime(pGO->GetRespawnDelay()); break; case TYPE_FREYA: - if (data == DONE) + if (state == DONE) if (GameObject* pGO = instance->GetGameObject(uiFreyaChestGUID)) pGO->SetRespawnTime(pGO->GetRespawnDelay()); break; + } + + return true; + } + + void SetData(uint32 type, uint32 data) + { + switch(type) + { case TYPE_COLOSSUS: uiEncounter[TYPE_COLOSSUS] = data; if (data == 2) @@ -279,14 +291,12 @@ public: pBoss->AI()->DoAction(10); if (GameObject* pGate = instance->GetGameObject(uiLeviathanGateGUID)) pGate->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); + SaveToDB(); } break; default: break; } - - if (data == DONE) - SaveToDB(); } uint64 GetData64(uint32 data) @@ -320,20 +330,6 @@ public: { switch(type) { - case TYPE_LEVIATHAN: - case TYPE_IGNIS: - case TYPE_RAZORSCALE: - case TYPE_XT002: - case TYPE_ASSEMBLY: - case TYPE_KOLOGARN: - case TYPE_AURIAYA: - case TYPE_MIMIRON: - case TYPE_HODIR: - case TYPE_THORIM: - case TYPE_FREYA: - case TYPE_VEZAX: - case TYPE_YOGGSARON: - case TYPE_ALGALON: case TYPE_COLOSSUS: return uiEncounter[type]; } @@ -346,15 +342,10 @@ public: OUT_SAVE_INST_DATA; std::ostringstream saveStream; - saveStream << "U U " << uiEncounter[0] << " " << uiEncounter[1] << " " << uiEncounter[2] << " " << uiEncounter[3] - << " " << uiEncounter[4] << " " << uiEncounter[5] << " " << uiEncounter[6] << " " << uiEncounter[7] - << " " << uiEncounter[8] << " " << uiEncounter[9] << " " << uiEncounter[10] << " " << uiEncounter[11] - << " " << uiEncounter[12] << " " << uiEncounter[13] << " " << uiEncounter[14]; - - m_strInstData = saveStream.str(); + saveStream << "U U " << GetBossSaveData() << " " << uiEncounter[14]; OUT_SAVE_INST_DATA_COMPLETE; - return m_strInstData; + return saveStream.str(); } void Load(const char* strIn) @@ -368,21 +359,21 @@ public: OUT_LOAD_INST_DATA(strIn); char dataHead1, dataHead2; - uint32 data0, data1, data2, data3, data4, data5, data6, - data7, data8, data9, data10, data11, data12, data13, data14; + uint32 data14; std::istringstream loadStream(strIn); - loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3 >> data4 >> data5 >> data6 - >> data7 >> data8 >> data9 >> data10 >> data11 >> data12 >> data13 >> data14; + loadStream >> dataHead1 >> dataHead2 >> data14; if (dataHead1 == 'U' && dataHead2 == 'U') { for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) { - loadStream >> uiEncounter[i]; - - if (uiEncounter[i] == IN_PROGRESS) - uiEncounter[i] = NOT_STARTED; + uint32 tmpState; + loadStream >> tmpState; + loadStream >> uiEncounter[data14]; //colossus pre leviathan + if (tmpState == IN_PROGRESS || tmpState > SPECIAL) + tmpState = NOT_STARTED; + SetBossState(i, EncounterState(tmpState)); } } OUT_LOAD_INST_DATA_COMPLETE; diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h b/src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h index dea6686f206..3030f38b3c6 100644 --- a/src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h +++ b/src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h @@ -43,7 +43,6 @@ enum eTypes DATA_BRUNDIR = 22, DATA_RUNEMASTER_MOLGEIM = 23, DATA_STORMCALLER_BRUNDIR = 24, - DATA_PRELEVIATHAN = 25, NPC_LEVIATHAN = 33113, NPC_IGNIS = 33118, diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/ulduar_teleporter.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/ulduar_teleporter.cpp index d70c3906597..566777e7894 100644 --- a/src/server/scripts/Northrend/Ulduar/ulduar/ulduar_teleporter.cpp +++ b/src/server/scripts/Northrend/Ulduar/ulduar/ulduar_teleporter.cpp @@ -89,31 +89,24 @@ public: bool OnGossipHello(Player *pPlayer, GameObject *pGO) { - InstanceScript* pInstance = pGO->GetInstanceScript(); - if (!pInstance) - return false; - - pPlayer->ADD_GOSSIP_ITEM(0, "Teleport to the Expedition Base Camp", GOSSIP_SENDER_MAIN, BASE_CAMP); - if (pInstance->GetBossState(DATA_PRELEVIATHAN) == DONE || pPlayer->isGameMaster()) + pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Expedition Base Camp", GOSSIP_SENDER_MAIN, BASE_CAMP); + if (InstanceScript* pInstance = pGO->GetInstanceScript()) { - pPlayer->ADD_GOSSIP_ITEM(0, "Teleport to the Formation Grounds", GOSSIP_SENDER_MAIN, GROUNDS); - if (pInstance->GetBossState(TYPE_LEVIATHAN) == DONE || pPlayer->isGameMaster()) + if (pInstance->GetData(TYPE_COLOSSUS) == 2) //count of 2 collossus death + pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Formation Grounds", GOSSIP_SENDER_MAIN, GROUNDS); + if (pInstance->GetBossState(TYPE_LEVIATHAN) == DONE) + pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Colossal Forge", GOSSIP_SENDER_MAIN, FORGE); + if (pInstance->GetBossState(TYPE_XT002) == DONE) { - pPlayer->ADD_GOSSIP_ITEM(0, "Teleport to the Colossal Forge", GOSSIP_SENDER_MAIN, FORGE); - if (pInstance->GetBossState(TYPE_XT002) == DONE || pPlayer->isGameMaster()) - { - pPlayer->ADD_GOSSIP_ITEM(0, "Teleport to the Scrapyard", GOSSIP_SENDER_MAIN, SCRAPYARD); - pPlayer->ADD_GOSSIP_ITEM(0, "Teleport to the Antechamber of Ulduar", GOSSIP_SENDER_MAIN, ANTECHAMBER); - if (pInstance->GetBossState(TYPE_KOLOGARN) == DONE || pPlayer->isGameMaster()) - { - pPlayer->ADD_GOSSIP_ITEM(0, "Teleport to the Shattered Walkway", GOSSIP_SENDER_MAIN, WALKWAY); - if (pInstance->GetBossState(TYPE_AURIAYA) == DONE || pPlayer->isGameMaster()) - pPlayer->ADD_GOSSIP_ITEM(0, "Teleport to the Conservatory of Life", GOSSIP_SENDER_MAIN, CONSERVATORY); - } - } + pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Scrapyard", GOSSIP_SENDER_MAIN, SCRAPYARD); + pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Antechamber of Ulduar", GOSSIP_SENDER_MAIN, ANTECHAMBER); } + if (pInstance->GetBossState(TYPE_KOLOGARN) == DONE) + pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Shattered Walkway", GOSSIP_SENDER_MAIN, WALKWAY); + if (pInstance->GetBossState(TYPE_AURIAYA) == DONE) + pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Conservatory of Life", GOSSIP_SENDER_MAIN, CONSERVATORY); } - pPlayer->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, pGO->GetGUID()); + pPlayer->SEND_GOSSIP_MENU(pGO->GetGOInfo()->GetGossipMenuId(), pGO->GetGUID()); return true; } |