aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/boss_flame_leviathan.cpp62
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp91
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/ulduar.h1
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/ulduar_teleporter.cpp35
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;
}