mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-21 09:44:45 +01:00
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 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;
|
||||
{
|
||||
spawnSupport = false;
|
||||
|
||||
uiSladRanAltar = 0;
|
||||
uiMoorabiAltar = 0;
|
||||
uiDrakkariColossusAltar = 0;
|
||||
timer = 0;
|
||||
phase = 0;
|
||||
toActivate = 0;
|
||||
|
||||
uiSladRanStatue = 0;
|
||||
uiMoorabiStatue = 0;
|
||||
uiDrakkariColossusStatue = 0;
|
||||
uiSladRan = 0;
|
||||
uiMoorabi = 0;
|
||||
uiDrakkariColossus = 0;
|
||||
uiGalDarah = 0;
|
||||
uiEckTheFerocious = 0;
|
||||
|
||||
uiEckTheFerociousDoor = 0;
|
||||
uiGalDarahDoor1 = 0;
|
||||
uiGalDarahDoor2 = 0;
|
||||
uiSladRanAltar = 0;
|
||||
uiMoorabiAltar = 0;
|
||||
uiDrakkariColossusAltar = 0;
|
||||
|
||||
uiBridge = 0;
|
||||
uiCollision = 0;
|
||||
uiSladRanStatue = 0;
|
||||
uiMoorabiStatue = 0;
|
||||
uiDrakkariColossusStatue = 0;
|
||||
uiGalDarahStatue = 0;
|
||||
|
||||
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
|
||||
}
|
||||
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);
|
||||
bool QueueActivation(uint64 guid, uint32 time)
|
||||
{
|
||||
if (timer)
|
||||
return false;
|
||||
|
||||
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);
|
||||
}
|
||||
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;
|
||||
|
||||
Reference in New Issue
Block a user