Gundrak: Fix bridge, statue & altar GO handling, by an Anonymous contributor. Closes #228
--HG-- branch : trunk
This commit is contained in:
@@ -20,6 +20,11 @@ struct TRINITY_DLL_DECL instance_gundrak : public ScriptedInstance
|
|||||||
};
|
};
|
||||||
|
|
||||||
bool bHeroicMode;
|
bool bHeroicMode;
|
||||||
|
bool spawnSupport;
|
||||||
|
|
||||||
|
uint32 timer;
|
||||||
|
uint32 phase;
|
||||||
|
uint64 toActivate;
|
||||||
|
|
||||||
uint64 uiSladRan;
|
uint64 uiSladRan;
|
||||||
uint64 uiMoorabi;
|
uint64 uiMoorabi;
|
||||||
@@ -33,7 +38,9 @@ struct TRINITY_DLL_DECL instance_gundrak : public ScriptedInstance
|
|||||||
uint64 uiSladRanStatue;
|
uint64 uiSladRanStatue;
|
||||||
uint64 uiMoorabiStatue;
|
uint64 uiMoorabiStatue;
|
||||||
uint64 uiDrakkariColossusStatue;
|
uint64 uiDrakkariColossusStatue;
|
||||||
|
uint64 uiGalDarahStatue;
|
||||||
uint64 uiEckTheFerociousDoor;
|
uint64 uiEckTheFerociousDoor;
|
||||||
|
uint64 uiEckTheFerociousDoorBehind;
|
||||||
uint64 uiGalDarahDoor1;
|
uint64 uiGalDarahDoor1;
|
||||||
uint64 uiGalDarahDoor2;
|
uint64 uiGalDarahDoor2;
|
||||||
uint64 uiBridge;
|
uint64 uiBridge;
|
||||||
@@ -41,10 +48,23 @@ struct TRINITY_DLL_DECL instance_gundrak : public ScriptedInstance
|
|||||||
|
|
||||||
uint32 m_auiEncounter[MAX_ENCOUNTER];
|
uint32 m_auiEncounter[MAX_ENCOUNTER];
|
||||||
|
|
||||||
|
GOState uiSladRanStatueState;
|
||||||
|
GOState uiMoorabiStatueState;
|
||||||
|
GOState uiDrakkariColossusStatueState;
|
||||||
|
GOState uiGalDarahStatueState;
|
||||||
|
GOState uiBridgeState;
|
||||||
|
GOState uiCollisionState;
|
||||||
|
|
||||||
std::string str_data;
|
std::string str_data;
|
||||||
|
|
||||||
void Initialize()
|
void Initialize()
|
||||||
{
|
{
|
||||||
|
spawnSupport = false;
|
||||||
|
|
||||||
|
timer = 0;
|
||||||
|
phase = 0;
|
||||||
|
toActivate = 0;
|
||||||
|
|
||||||
uiSladRan = 0;
|
uiSladRan = 0;
|
||||||
uiMoorabi = 0;
|
uiMoorabi = 0;
|
||||||
uiDrakkariColossus = 0;
|
uiDrakkariColossus = 0;
|
||||||
@@ -58,14 +78,23 @@ struct TRINITY_DLL_DECL instance_gundrak : public ScriptedInstance
|
|||||||
uiSladRanStatue = 0;
|
uiSladRanStatue = 0;
|
||||||
uiMoorabiStatue = 0;
|
uiMoorabiStatue = 0;
|
||||||
uiDrakkariColossusStatue = 0;
|
uiDrakkariColossusStatue = 0;
|
||||||
|
uiGalDarahStatue = 0;
|
||||||
|
|
||||||
uiEckTheFerociousDoor = 0;
|
uiEckTheFerociousDoor = 0;
|
||||||
|
uiEckTheFerociousDoorBehind = 0;
|
||||||
uiGalDarahDoor1 = 0;
|
uiGalDarahDoor1 = 0;
|
||||||
uiGalDarahDoor2 = 0;
|
uiGalDarahDoor2 = 0;
|
||||||
|
|
||||||
uiBridge = 0;
|
uiBridge = 0;
|
||||||
uiCollision = 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));
|
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,33 +124,74 @@ struct TRINITY_DLL_DECL instance_gundrak : public ScriptedInstance
|
|||||||
{
|
{
|
||||||
case 192518:
|
case 192518:
|
||||||
uiSladRanAltar = pGo->GetGUID();
|
uiSladRanAltar = pGo->GetGUID();
|
||||||
|
// Make sure that they start out as unusuable
|
||||||
|
pGo->SetFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1);
|
||||||
if (m_auiEncounter[0] == DONE)
|
if (m_auiEncounter[0] == DONE)
|
||||||
|
{
|
||||||
|
if (uiSladRanStatueState == GO_STATE_ACTIVE)
|
||||||
pGo->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1);
|
pGo->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
++phase;
|
||||||
|
pGo->SetGoState(GO_STATE_ACTIVE);
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 192519:
|
case 192519:
|
||||||
uiMoorabiAltar = pGo->GetGUID();
|
uiMoorabiAltar = pGo->GetGUID();
|
||||||
if (m_auiEncounter[1] == DONE)
|
// 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);
|
pGo->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
++phase;
|
||||||
|
pGo->SetGoState(GO_STATE_ACTIVE);
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 192520:
|
case 192520:
|
||||||
uiDrakkariColossusAltar = pGo->GetGUID();
|
uiDrakkariColossusAltar = pGo->GetGUID();
|
||||||
if (m_auiEncounter[2] == DONE)
|
// 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);
|
pGo->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
++phase;
|
||||||
|
pGo->SetGoState(GO_STATE_ACTIVE);
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 192564:
|
case 192564:
|
||||||
uiSladRanStatue = pGo->GetGUID();
|
uiSladRanStatue = pGo->GetGUID();
|
||||||
|
pGo->SetGoState(uiSladRanStatueState);
|
||||||
break;
|
break;
|
||||||
case 192565:
|
case 192565:
|
||||||
uiMoorabiStatue = pGo->GetGUID();
|
uiMoorabiStatue = pGo->GetGUID();
|
||||||
|
pGo->SetGoState(uiMoorabiStatueState);
|
||||||
|
break;
|
||||||
|
case 192566:
|
||||||
|
uiGalDarahStatue = pGo->GetGUID();
|
||||||
|
pGo->SetGoState(uiGalDarahStatueState);
|
||||||
break;
|
break;
|
||||||
case 192567:
|
case 192567:
|
||||||
uiDrakkariColossusStatue = pGo->GetGUID();
|
uiDrakkariColossusStatue = pGo->GetGUID();
|
||||||
|
pGo->SetGoState(uiDrakkariColossusStatueState);
|
||||||
break;
|
break;
|
||||||
case 192632:
|
case 192632:
|
||||||
uiEckTheFerociousDoor = pGo->GetGUID();
|
uiEckTheFerociousDoor = pGo->GetGUID();
|
||||||
if (bHeroicMode && m_auiEncounter[1] == DONE)
|
if (bHeroicMode && m_auiEncounter[1] == DONE)
|
||||||
HandleGameObject(NULL,true,pGo);
|
HandleGameObject(NULL,true,pGo);
|
||||||
break;
|
break;
|
||||||
|
case 192569:
|
||||||
|
uiEckTheFerociousDoorBehind = pGo->GetGUID();
|
||||||
|
if (bHeroicMode && m_auiEncounter[4] == DONE)
|
||||||
|
HandleGameObject(NULL,true,pGo);
|
||||||
case 193208:
|
case 193208:
|
||||||
uiGalDarahDoor1 = pGo->GetGUID();
|
uiGalDarahDoor1 = pGo->GetGUID();
|
||||||
if (m_auiEncounter[3] == DONE)
|
if (m_auiEncounter[3] == DONE)
|
||||||
@@ -134,11 +204,15 @@ struct TRINITY_DLL_DECL instance_gundrak : public ScriptedInstance
|
|||||||
break;
|
break;
|
||||||
case 193188:
|
case 193188:
|
||||||
uiBridge = pGo->GetGUID();
|
uiBridge = pGo->GetGUID();
|
||||||
HandleGameObject(NULL,true,pGo);
|
pGo->SetGoState(uiBridgeState);
|
||||||
break;
|
break;
|
||||||
case 192633:
|
case 192633:
|
||||||
uiCollision = pGo->GetGUID();
|
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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -186,6 +260,8 @@ struct TRINITY_DLL_DECL instance_gundrak : public ScriptedInstance
|
|||||||
break;
|
break;
|
||||||
case DATA_ECK_THE_FEROCIOUS_EVENT:
|
case DATA_ECK_THE_FEROCIOUS_EVENT:
|
||||||
m_auiEncounter[4] = data;
|
m_auiEncounter[4] = data;
|
||||||
|
if (bHeroicMode && data == DONE)
|
||||||
|
HandleGameObject(uiEckTheFerociousDoorBehind,true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -228,7 +304,11 @@ struct TRINITY_DLL_DECL instance_gundrak : public ScriptedInstance
|
|||||||
|
|
||||||
std::ostringstream saveStream;
|
std::ostringstream saveStream;
|
||||||
saveStream << "G D " << m_auiEncounter[0] << " " << m_auiEncounter[1] << " "
|
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();
|
str_data = saveStream.str();
|
||||||
|
|
||||||
@@ -247,10 +327,11 @@ struct TRINITY_DLL_DECL instance_gundrak : public ScriptedInstance
|
|||||||
OUT_LOAD_INST_DATA(in);
|
OUT_LOAD_INST_DATA(in);
|
||||||
|
|
||||||
char dataHead1, dataHead2;
|
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);
|
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')
|
if (dataHead1 == 'G' && dataHead2 == 'D')
|
||||||
{
|
{
|
||||||
@@ -259,6 +340,12 @@ struct TRINITY_DLL_DECL instance_gundrak : public ScriptedInstance
|
|||||||
m_auiEncounter[2] = data2;
|
m_auiEncounter[2] = data2;
|
||||||
m_auiEncounter[3] = data3;
|
m_auiEncounter[3] = data3;
|
||||||
m_auiEncounter[4] = data4;
|
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)
|
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||||
if (m_auiEncounter[i] == IN_PROGRESS)
|
if (m_auiEncounter[i] == IN_PROGRESS)
|
||||||
@@ -268,26 +355,111 @@ struct TRINITY_DLL_DECL instance_gundrak : public ScriptedInstance
|
|||||||
OUT_LOAD_INST_DATA_COMPLETE;
|
OUT_LOAD_INST_DATA_COMPLETE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckAltars()
|
bool QueueActivation(uint64 guid, uint32 time)
|
||||||
{
|
{
|
||||||
GameObject* pSladRanAltar = instance->GetGameObject(uiSladRanAltar);
|
if (timer)
|
||||||
GameObject* pMoorabiAltar = instance->GetGameObject(uiMoorabiAltar);
|
return false;
|
||||||
GameObject* pDrakkariColossusAltar = instance->GetGameObject(uiDrakkariColossusAltar);
|
|
||||||
|
|
||||||
if (pSladRanAltar && pSladRanAltar->GetGoState() == GO_STATE_ACTIVE &&
|
toActivate = guid;
|
||||||
pMoorabiAltar && pMoorabiAltar->GetGoState() == GO_STATE_ACTIVE &&
|
timer = time;
|
||||||
pDrakkariColossusAltar && pDrakkariColossusAltar->GetGoState() == GO_STATE_ACTIVE)
|
phase++;
|
||||||
{
|
return true;
|
||||||
HandleGameObject(uiBridge,false);
|
|
||||||
HandleGameObject(uiCollision,false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
bool GOHello_altar(Player *pPlayer, GameObject *pGO)
|
||||||
{
|
{
|
||||||
ScriptedInstance *pInstance = pGO->GetInstanceData();
|
ScriptedInstance *pInstance = pGO->GetInstanceData();
|
||||||
uint32 uiStatue;
|
uint64 uiStatue;
|
||||||
|
|
||||||
pGO->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
|
pGO->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
|
||||||
pGO->SetGoState(GO_STATE_ACTIVE);
|
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 192519: uiStatue = pInstance->GetData64(DATA_MOORABI_STATUE); break;
|
||||||
case 192520: uiStatue = pInstance->GetData64(DATA_DRAKKARI_COLOSSUS_STATUE); break;
|
case 192520: uiStatue = pInstance->GetData64(DATA_DRAKKARI_COLOSSUS_STATUE); break;
|
||||||
}
|
}
|
||||||
pInstance->HandleGameObject(uiStatue,true);
|
if (((instance_gundrak*)pInstance)->QueueActivation(uiStatue, 3500))
|
||||||
((instance_gundrak*)pInstance)->CheckAltars();
|
{
|
||||||
|
pGO->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
|
||||||
|
pGO->SetGoState(GO_STATE_ACTIVE);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
Reference in New Issue
Block a user