diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bindings/scripts/scripts/northrend/gundrak/instance_gundrak.cpp | 275 |
1 files changed, 225 insertions, 50 deletions
diff --git a/src/bindings/scripts/scripts/northrend/gundrak/instance_gundrak.cpp b/src/bindings/scripts/scripts/northrend/gundrak/instance_gundrak.cpp index 07cafd2dc55..9a3ddb32877 100644 --- a/src/bindings/scripts/scripts/northrend/gundrak/instance_gundrak.cpp +++ b/src/bindings/scripts/scripts/northrend/gundrak/instance_gundrak.cpp @@ -20,6 +20,11 @@ struct TRINITY_DLL_DECL instance_gundrak : public ScriptedInstance }; bool bHeroicMode; + bool spawnSupport; + + uint32 timer; + uint32 phase; + uint64 toActivate; uint64 uiSladRan; uint64 uiMoorabi; @@ -33,7 +38,9 @@ struct TRINITY_DLL_DECL instance_gundrak : public ScriptedInstance uint64 uiSladRanStatue; uint64 uiMoorabiStatue; uint64 uiDrakkariColossusStatue; + uint64 uiGalDarahStatue; uint64 uiEckTheFerociousDoor; + uint64 uiEckTheFerociousDoorBehind; uint64 uiGalDarahDoor1; uint64 uiGalDarahDoor2; uint64 uiBridge; @@ -41,33 +48,55 @@ struct TRINITY_DLL_DECL instance_gundrak : public ScriptedInstance uint32 m_auiEncounter[MAX_ENCOUNTER]; + GOState uiSladRanStatueState; + GOState uiMoorabiStatueState; + GOState uiDrakkariColossusStatueState; + GOState uiGalDarahStatueState; + GOState uiBridgeState; + GOState uiCollisionState; + std::string str_data; void Initialize() - { - uiSladRan = 0; - uiMoorabi = 0; - uiDrakkariColossus = 0; - uiGalDarah = 0; - uiEckTheFerocious = 0; - - uiSladRanAltar = 0; - uiMoorabiAltar = 0; - uiDrakkariColossusAltar = 0; - - uiSladRanStatue = 0; - uiMoorabiStatue = 0; - uiDrakkariColossusStatue = 0; - - uiEckTheFerociousDoor = 0; - uiGalDarahDoor1 = 0; - uiGalDarahDoor2 = 0; - - uiBridge = 0; - uiCollision = 0; - - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - } + { + spawnSupport = false; + + timer = 0; + phase = 0; + toActivate = 0; + + uiSladRan = 0; + uiMoorabi = 0; + uiDrakkariColossus = 0; + uiGalDarah = 0; + uiEckTheFerocious = 0; + + uiSladRanAltar = 0; + uiMoorabiAltar = 0; + uiDrakkariColossusAltar = 0; + + uiSladRanStatue = 0; + uiMoorabiStatue = 0; + uiDrakkariColossusStatue = 0; + uiGalDarahStatue = 0; + + uiEckTheFerociousDoor = 0; + uiEckTheFerociousDoorBehind = 0; + uiGalDarahDoor1 = 0; + uiGalDarahDoor2 = 0; + + uiBridge = 0; + uiCollision = 0; + + uiSladRanStatueState = GO_STATE_ACTIVE; + uiMoorabiStatueState = GO_STATE_ACTIVE; + uiDrakkariColossusStatueState = GO_STATE_ACTIVE; + uiGalDarahStatueState = GO_STATE_READY; + uiBridgeState = GO_STATE_ACTIVE; + uiCollisionState = GO_STATE_READY; + + memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); + } bool IsEncounterInProgress() const { @@ -95,33 +124,74 @@ struct TRINITY_DLL_DECL instance_gundrak : public ScriptedInstance { case 192518: uiSladRanAltar = pGo->GetGUID(); + // Make sure that they start out as unusuable + pGo->SetFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1); if (m_auiEncounter[0] == DONE) - pGo->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1); + { + if (uiSladRanStatueState == GO_STATE_ACTIVE) + pGo->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1); + else + { + ++phase; + pGo->SetGoState(GO_STATE_ACTIVE); + } + } break; case 192519: uiMoorabiAltar = pGo->GetGUID(); - if (m_auiEncounter[1] == DONE) - pGo->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1); + // Make sure that they start out as unusuable + pGo->SetFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1); + if (m_auiEncounter[0] == DONE) + { + if (uiMoorabiStatueState == GO_STATE_ACTIVE) + pGo->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1); + else + { + ++phase; + pGo->SetGoState(GO_STATE_ACTIVE); + } + } break; case 192520: uiDrakkariColossusAltar = pGo->GetGUID(); - if (m_auiEncounter[2] == DONE) - pGo->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1); + // Make sure that they start out as unusuable + pGo->SetFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1); + if (m_auiEncounter[0] == DONE) + { + if (uiDrakkariColossusStatueState == GO_STATE_ACTIVE) + pGo->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1); + else + { + ++phase; + pGo->SetGoState(GO_STATE_ACTIVE); + } + } break; case 192564: uiSladRanStatue = pGo->GetGUID(); + pGo->SetGoState(uiSladRanStatueState); break; case 192565: uiMoorabiStatue = pGo->GetGUID(); + pGo->SetGoState(uiMoorabiStatueState); + break; + case 192566: + uiGalDarahStatue = pGo->GetGUID(); + pGo->SetGoState(uiGalDarahStatueState); break; case 192567: uiDrakkariColossusStatue = pGo->GetGUID(); + pGo->SetGoState(uiDrakkariColossusStatueState); break; case 192632: uiEckTheFerociousDoor = pGo->GetGUID(); if (bHeroicMode && m_auiEncounter[1] == DONE) HandleGameObject(NULL,true,pGo); break; + case 192569: + uiEckTheFerociousDoorBehind = pGo->GetGUID(); + if (bHeroicMode && m_auiEncounter[4] == DONE) + HandleGameObject(NULL,true,pGo); case 193208: uiGalDarahDoor1 = pGo->GetGUID(); if (m_auiEncounter[3] == DONE) @@ -134,11 +204,15 @@ struct TRINITY_DLL_DECL instance_gundrak : public ScriptedInstance break; case 193188: uiBridge = pGo->GetGUID(); - HandleGameObject(NULL,true,pGo); + pGo->SetGoState(uiBridgeState); break; case 192633: uiCollision = pGo->GetGUID(); - HandleGameObject(NULL,true,pGo); + pGo->SetGoState(uiCollisionState); + + // Can't spawn here with SpawnGameObject because pGo isn't added to world yet... + if (uiCollisionState == GO_STATE_ACTIVE_ALTERNATIVE) + spawnSupport = true; break; } } @@ -186,6 +260,8 @@ struct TRINITY_DLL_DECL instance_gundrak : public ScriptedInstance break; case DATA_ECK_THE_FEROCIOUS_EVENT: m_auiEncounter[4] = data; + if (bHeroicMode && data == DONE) + HandleGameObject(uiEckTheFerociousDoorBehind,true); break; } @@ -228,7 +304,11 @@ struct TRINITY_DLL_DECL instance_gundrak : public ScriptedInstance std::ostringstream saveStream; saveStream << "G D " << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " - << m_auiEncounter[2] << " " << m_auiEncounter[3] << " " << m_auiEncounter[4]; + << m_auiEncounter[2] << " " << m_auiEncounter[3] << " " << m_auiEncounter[4] << " " + << (uiSladRanStatue ? GetObjState(uiSladRanStatue) : GO_STATE_ACTIVE) << " " << (uiMoorabiStatue ? GetObjState(uiMoorabiStatue) : GO_STATE_ACTIVE) << " " + << (uiDrakkariColossusStatue ? GetObjState(uiDrakkariColossusStatue) : GO_STATE_ACTIVE) << " " << (uiGalDarahStatue ? GetObjState(uiGalDarahStatue) : GO_STATE_READY) << " " + << (uiBridge ? GetObjState(uiBridge) : GO_STATE_ACTIVE) << " " << (uiCollision ? GetObjState(uiCollision) : GO_STATE_READY); + str_data = saveStream.str(); @@ -247,10 +327,11 @@ struct TRINITY_DLL_DECL instance_gundrak : public ScriptedInstance OUT_LOAD_INST_DATA(in); char dataHead1, dataHead2; - uint16 data0, data1, data2, data3, data4; + uint16 data0, data1, data2, data3, data4, data5, data6, data7, data8, data9, data10; std::istringstream loadStream(in); - loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3 >> data4; + loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3 + >> data4 >> data5 >> data6 >> data7 >> data8 >> data9 >> data10; if (dataHead1 == 'G' && dataHead2 == 'D') { @@ -259,6 +340,12 @@ struct TRINITY_DLL_DECL instance_gundrak : public ScriptedInstance m_auiEncounter[2] = data2; m_auiEncounter[3] = data3; m_auiEncounter[4] = data4; + uiSladRanStatueState = GOState(data5); + uiMoorabiStatueState = GOState(data6); + uiDrakkariColossusStatueState = GOState(data7); + uiGalDarahStatueState = GOState(data8); + uiBridgeState = GOState(data9); + uiCollisionState = GOState(data10); for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) if (m_auiEncounter[i] == IN_PROGRESS) @@ -268,26 +355,111 @@ struct TRINITY_DLL_DECL instance_gundrak : public ScriptedInstance OUT_LOAD_INST_DATA_COMPLETE; } - void CheckAltars() - { - GameObject* pSladRanAltar = instance->GetGameObject(uiSladRanAltar); - GameObject* pMoorabiAltar = instance->GetGameObject(uiMoorabiAltar); - GameObject* pDrakkariColossusAltar = instance->GetGameObject(uiDrakkariColossusAltar); - - if (pSladRanAltar && pSladRanAltar->GetGoState() == GO_STATE_ACTIVE && - pMoorabiAltar && pMoorabiAltar->GetGoState() == GO_STATE_ACTIVE && - pDrakkariColossusAltar && pDrakkariColossusAltar->GetGoState() == GO_STATE_ACTIVE) - { - HandleGameObject(uiBridge,false); - HandleGameObject(uiCollision,false); - } + bool QueueActivation(uint64 guid, uint32 time) + { + if (timer) + return false; + + toActivate = guid; + timer = time; + phase++; + return true; + } + + void Update(uint32 diff) + { + // Spawn the support for the bridge if necessary + if (spawnSupport) + { + if (GameObject* pCollision = instance->GetGameObject(uiCollision)) + pCollision->SummonGameObject(192743, pCollision->GetPositionX(), pCollision->GetPositionY(), pCollision->GetPositionZ(), pCollision->GetOrientation(), 0, 0, 0, 0, 0); + spawnSupport = false; + } + + // If there is nothing to activate, then return + if (!toActivate) + return; + + if (timer < diff) + { + timer = 0; + if (toActivate == uiBridge) + { + toActivate = 0; + GameObject* pBridge = instance->GetGameObject(uiBridge); + GameObject* pCollision = instance->GetGameObject(uiCollision); + GameObject* pSladRanStatue = instance->GetGameObject(uiSladRanStatue); + GameObject* pMoorabiStatue = instance->GetGameObject(uiMoorabiStatue); + GameObject* pDrakkariColossusStatue = instance->GetGameObject(uiDrakkariColossusStatue); + GameObject* pGalDarahStatue = instance->GetGameObject(uiGalDarahStatue); + + if (pBridge && pCollision && pSladRanStatue && pMoorabiStatue && pDrakkariColossusStatue && pGalDarahStatue) + { + pBridge->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); + pCollision->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); + pSladRanStatue->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); + pMoorabiStatue->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); + pDrakkariColossusStatue->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); + pGalDarahStatue->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); + + // Add the GO that solidifies the bridge so you can walk on it + spawnSupport = true; + SaveToDB(); + } + } + else + { + uint32 spell = 0; + GameObject* pAltar = NULL; + if (toActivate == uiSladRanStatue) + { + spell = 57071; + pAltar = instance->GetGameObject(uiSladRanAltar); + } else if (toActivate == uiMoorabiStatue) + { + spell = 57068; + pAltar = instance->GetGameObject(uiMoorabiAltar); + } else if (toActivate == uiDrakkariColossusStatue) + { + spell = 57072; + pAltar = instance->GetGameObject(uiDrakkariColossusAltar); + } + + // This is a workaround to make the beam cast properly. The caster should be ID 30298 but since the spells + // all are with scripted target for that same ID, it will hit itself. + if (pAltar) + if (Creature* trigger = pAltar->SummonCreature(18721, pAltar->GetPositionX(), pAltar->GetPositionY(), pAltar->GetPositionZ() + 3, pAltar->GetOrientation(), TEMPSUMMON_CORPSE_DESPAWN, 5000)) + { + // Set the trigger model to invisible + trigger->SetDisplayId(11686); + trigger->CastSpell(trigger, spell, false); + } + + if (GameObject* statueGO = instance->GetGameObject(toActivate)) + statueGO->SetGoState(GO_STATE_READY); + + toActivate = 0; + + if (phase == 3) + QueueActivation(uiBridge, 3000); + else + SaveToDB(); // Don't save in between last statue and bridge turning in case of crash leading to stuck instance + } + } else timer -= diff; } + + GOState GetObjState(uint64 guid) + { + if (GameObject* go = instance->GetGameObject(guid)) + return go->GetGoState(); + return GO_STATE_ACTIVE; + } }; bool GOHello_altar(Player *pPlayer, GameObject *pGO) { ScriptedInstance *pInstance = pGO->GetInstanceData(); - uint32 uiStatue; + uint64 uiStatue; pGO->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1); pGO->SetGoState(GO_STATE_ACTIVE); @@ -300,8 +472,11 @@ bool GOHello_altar(Player *pPlayer, GameObject *pGO) case 192519: uiStatue = pInstance->GetData64(DATA_MOORABI_STATUE); break; case 192520: uiStatue = pInstance->GetData64(DATA_DRAKKARI_COLOSSUS_STATUE); break; } - pInstance->HandleGameObject(uiStatue,true); - ((instance_gundrak*)pInstance)->CheckAltars(); + if (((instance_gundrak*)pInstance)->QueueActivation(uiStatue, 3500)) + { + pGO->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1); + pGO->SetGoState(GO_STATE_ACTIVE); + } return true; } return false; |