aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortartalo <none@none>2009-12-09 12:50:58 +0100
committertartalo <none@none>2009-12-09 12:50:58 +0100
commitb05e02ea4543cce90eb9494b5f851c7803198c8f (patch)
tree8e19bc7185d7b5284d8ab4552b83f4368ded15be /src
parentec5882a8d535ad791ccc837035b7e254fa9637dc (diff)
Gundrak: Fix bridge, statue & altar GO handling, by an Anonymous contributor. Closes #228
--HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/bindings/scripts/scripts/northrend/gundrak/instance_gundrak.cpp275
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;