Core/Scripts/Ulduar: fix Ulduar Teleporter

- fix ulduar save system
- adjust leviathan to use correct savesystem

--HG--
branch : trunk
This commit is contained in:
Supabad
2010-10-04 15:11:01 +02:00
parent 729e618baa
commit 5adaf5887e
4 changed files with 79 additions and 110 deletions
@@ -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;
}
}
@@ -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)
bool SetBossState(uint32 type, EncounterState state)
{
if (!InstanceScript::SetBossState(type, state))
return false;
switch (type)
{
/*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_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;
@@ -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,
@@ -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;
}