Violet Hold: Implemented wipe mode, after the party wipes the instance reset, but you should play against the same bosses already defated or fought (with out loot) to continue.
--HG-- branch : trunk
This commit is contained in:
@@ -78,6 +78,12 @@ struct TRINITY_DLL_DECL boss_cyanigosaAI : public ScriptedAI
|
|||||||
|
|
||||||
void UpdateAI(const uint32 diff)
|
void UpdateAI(const uint32 diff)
|
||||||
{
|
{
|
||||||
|
if (pInstance && pInstance->GetData(DATA_REMOVE_NPC) == 1)
|
||||||
|
{
|
||||||
|
m_creature->ForcedDespawn();
|
||||||
|
pInstance->SetData(DATA_REMOVE_NPC, 0);
|
||||||
|
}
|
||||||
|
|
||||||
//Return since we have no target
|
//Return since we have no target
|
||||||
if (!UpdateVictim())
|
if (!UpdateVictim())
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -76,12 +76,16 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance
|
|||||||
uint8 uiLocation;
|
uint8 uiLocation;
|
||||||
uint8 uiFirstBoss;
|
uint8 uiFirstBoss;
|
||||||
uint8 uiSecondBoss;
|
uint8 uiSecondBoss;
|
||||||
|
uint8 uiRemoveNpc;
|
||||||
|
|
||||||
uint8 m_auiEncounter[MAX_ENCOUNTER];
|
uint8 m_auiEncounter[MAX_ENCOUNTER];
|
||||||
uint8 uiCountErekemGuards;
|
uint8 uiCountErekemGuards;
|
||||||
uint8 uiCountActivationCrystals;
|
uint8 uiCountActivationCrystals;
|
||||||
|
uint8 uiPlayersDead;
|
||||||
|
uint8 uiMaxPlayerCount;
|
||||||
|
|
||||||
bool bActive;
|
bool bActive;
|
||||||
|
bool bWiped;
|
||||||
|
|
||||||
std::string str_data;
|
std::string str_data;
|
||||||
|
|
||||||
@@ -105,6 +109,7 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance
|
|||||||
uiXevozzCell = 0;
|
uiXevozzCell = 0;
|
||||||
uiZuramatCell = 0;
|
uiZuramatCell = 0;
|
||||||
uiMainDoor = 0;
|
uiMainDoor = 0;
|
||||||
|
uiRemoveNpc = 0;
|
||||||
|
|
||||||
uiWaveCount = 0;
|
uiWaveCount = 0;
|
||||||
uiLocation = 0;
|
uiLocation = 0;
|
||||||
@@ -112,10 +117,13 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance
|
|||||||
uiSecondBoss = 0;
|
uiSecondBoss = 0;
|
||||||
uiCountErekemGuards = 0;
|
uiCountErekemGuards = 0;
|
||||||
uiCountActivationCrystals = 0;
|
uiCountActivationCrystals = 0;
|
||||||
|
uiPlayersDead = 0;
|
||||||
|
uiMaxPlayerCount = 0;
|
||||||
|
|
||||||
uiActivationTimer = 5000;
|
uiActivationTimer = 5000;
|
||||||
|
|
||||||
bActive = false;
|
bActive = false;
|
||||||
|
bWiped = false;
|
||||||
|
|
||||||
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
|
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
|
||||||
}
|
}
|
||||||
@@ -228,6 +236,9 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance
|
|||||||
uiWaveCount = data;
|
uiWaveCount = data;
|
||||||
bActive = true;
|
bActive = true;
|
||||||
break;
|
break;
|
||||||
|
case DATA_REMOVE_NPC:
|
||||||
|
uiRemoveNpc = data;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -239,6 +250,7 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance
|
|||||||
case DATA_2ND_BOSS_EVENT: return m_auiEncounter[1];
|
case DATA_2ND_BOSS_EVENT: return m_auiEncounter[1];
|
||||||
case DATA_CYANIGOSA_EVENT: return m_auiEncounter[2];
|
case DATA_CYANIGOSA_EVENT: return m_auiEncounter[2];
|
||||||
case DATA_WAVE_COUNT: return uiWaveCount;
|
case DATA_WAVE_COUNT: return uiWaveCount;
|
||||||
|
case DATA_REMOVE_NPC: return uiRemoveNpc;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -263,23 +275,26 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void StartBossEncounter(uint8 uiBoss)
|
void StartBossEncounter(uint8 uiBoss, bool bForceRespawn = true)
|
||||||
{
|
{
|
||||||
Creature* pBoss = NULL;
|
Creature* pBoss = NULL;
|
||||||
switch(uiBoss)
|
switch(uiBoss)
|
||||||
{
|
{
|
||||||
case 0: //Moragg
|
case 0: //Moragg
|
||||||
HandleGameObject(uiMoraggCell,true);
|
HandleGameObject(uiMoraggCell,bForceRespawn);
|
||||||
|
|
||||||
if (pBoss = instance->GetCreature(uiMoragg))
|
if (pBoss = instance->GetCreature(uiMoragg))
|
||||||
{
|
{
|
||||||
pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
|
pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
|
||||||
pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 1: //Erekem
|
case 1: //Erekem
|
||||||
HandleGameObject(uiErekemCell,true);
|
HandleGameObject(uiErekemCell,bForceRespawn);
|
||||||
HandleGameObject(uiErekemRightGuardCell,true);
|
HandleGameObject(uiErekemRightGuardCell,bForceRespawn);
|
||||||
HandleGameObject(uiErekemLeftGuardCell,true);
|
HandleGameObject(uiErekemLeftGuardCell,bForceRespawn);
|
||||||
|
|
||||||
if (pBoss = instance->GetCreature(uiErekem))
|
if (pBoss = instance->GetCreature(uiErekem))
|
||||||
{
|
{
|
||||||
pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
|
pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
|
||||||
@@ -297,7 +312,7 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2: //Ichoron
|
case 2: //Ichoron
|
||||||
HandleGameObject(uiIchoronCell,true);
|
HandleGameObject(uiIchoronCell,bForceRespawn);
|
||||||
if (pBoss = instance->GetCreature(uiIchoron))
|
if (pBoss = instance->GetCreature(uiIchoron))
|
||||||
{
|
{
|
||||||
pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
|
pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
|
||||||
@@ -305,7 +320,7 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 3: //Lavanthor
|
case 3: //Lavanthor
|
||||||
HandleGameObject(uiLavanthorCell,true);
|
HandleGameObject(uiLavanthorCell,bForceRespawn);
|
||||||
if (pBoss = instance->GetCreature(uiLavanthor))
|
if (pBoss = instance->GetCreature(uiLavanthor))
|
||||||
{
|
{
|
||||||
pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
|
pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
|
||||||
@@ -313,7 +328,7 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 4: //Xevozz
|
case 4: //Xevozz
|
||||||
HandleGameObject(uiXevozzCell,true);
|
HandleGameObject(uiXevozzCell,bForceRespawn);
|
||||||
if (pBoss = instance->GetCreature(uiXevozz))
|
if (pBoss = instance->GetCreature(uiXevozz))
|
||||||
{
|
{
|
||||||
pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
|
pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
|
||||||
@@ -321,7 +336,7 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 5: //Zuramat
|
case 5: //Zuramat
|
||||||
HandleGameObject(uiZuramatCell,true);
|
HandleGameObject(uiZuramatCell,bForceRespawn);
|
||||||
if (pBoss = instance->GetCreature(uiZuramat))
|
if (pBoss = instance->GetCreature(uiZuramat))
|
||||||
{
|
{
|
||||||
pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
|
pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
|
||||||
@@ -329,6 +344,16 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (!bForceRespawn && pBoss)
|
||||||
|
{
|
||||||
|
pBoss->AllLootRemovedFromCorpse();
|
||||||
|
pBoss->Respawn();
|
||||||
|
pBoss->RemoveLootMode(1);
|
||||||
|
pBoss->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
|
||||||
|
pBoss->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||||
|
SetData(DATA_WAVE_COUNT,0);
|
||||||
|
uiWaveCount = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddWave()
|
void AddWave()
|
||||||
@@ -360,7 +385,9 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance
|
|||||||
pMainDoor->SetGoState(GO_STATE_READY);
|
pMainDoor->SetGoState(GO_STATE_READY);
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
SpawnPortal();
|
if (!bWiped)
|
||||||
|
SpawnPortal();
|
||||||
|
bWiped = false;
|
||||||
}
|
}
|
||||||
bActive = true;
|
bActive = true;
|
||||||
}
|
}
|
||||||
@@ -440,8 +467,35 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance
|
|||||||
OUT_LOAD_INST_DATA_COMPLETE;
|
OUT_LOAD_INST_DATA_COMPLETE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CountPlayers(bool bCheckState = false)
|
||||||
|
{
|
||||||
|
if (!bCheckState)
|
||||||
|
{
|
||||||
|
uiMaxPlayerCount = 0;
|
||||||
|
Map::PlayerList const &players = instance->GetPlayers();
|
||||||
|
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
|
||||||
|
++uiMaxPlayerCount;
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
Map::PlayerList const &players = instance->GetPlayers();
|
||||||
|
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
|
||||||
|
{
|
||||||
|
Player* pPlayer = itr->getSource();
|
||||||
|
|
||||||
|
if (pPlayer->isDead() && !pPlayer->isGameMaster())
|
||||||
|
++uiPlayersDead;
|
||||||
|
else if (pPlayer->isAlive() && !pPlayer->isGameMaster())
|
||||||
|
uiPlayersDead = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Update(uint32 diff)
|
void Update(uint32 diff)
|
||||||
{
|
{
|
||||||
|
if (!instance->HavePlayers())
|
||||||
|
return;
|
||||||
|
|
||||||
if (bActive)
|
if (bActive)
|
||||||
{
|
{
|
||||||
if (uiActivationTimer < diff)
|
if (uiActivationTimer < diff)
|
||||||
@@ -451,6 +505,27 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance
|
|||||||
uiActivationTimer = 5000;
|
uiActivationTimer = 5000;
|
||||||
} else uiActivationTimer -= diff;
|
} else uiActivationTimer -= diff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CountPlayers(true);
|
||||||
|
CountPlayers(false);
|
||||||
|
|
||||||
|
if (GameObject* pMainDoor = instance->GetGameObject(uiMainDoor))
|
||||||
|
if (pMainDoor->GetGoState() != GO_STATE_ACTIVE && uiPlayersDead >= uiMaxPlayerCount)
|
||||||
|
{
|
||||||
|
SetData(DATA_REMOVE_NPC, 1);
|
||||||
|
StartBossEncounter(uiFirstBoss, false);
|
||||||
|
StartBossEncounter(uiSecondBoss, false);
|
||||||
|
bWiped = true;
|
||||||
|
if (Creature* pSinclari = instance->GetCreature(uiSinclari))
|
||||||
|
{
|
||||||
|
pSinclari->DisappearAndDie();
|
||||||
|
pSinclari->Respawn(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GameObject* pMainDoor = instance->GetGameObject(uiMainDoor))
|
||||||
|
pMainDoor->SetGoState(GO_STATE_ACTIVE);
|
||||||
|
SetData(DATA_WAVE_COUNT, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -55,6 +55,8 @@ struct TRINITY_DLL_DECL npc_sinclariAI : public ScriptedAI
|
|||||||
{
|
{
|
||||||
if (Creature* pGuard = *itr)
|
if (Creature* pGuard = *itr)
|
||||||
{
|
{
|
||||||
|
pGuard->DisappearAndDie();
|
||||||
|
pGuard->Respawn();
|
||||||
pGuard->SetVisibility(VISIBILITY_ON);
|
pGuard->SetVisibility(VISIBILITY_ON);
|
||||||
pGuard->SetReactState(REACT_AGGRESSIVE);
|
pGuard->SetReactState(REACT_AGGRESSIVE);
|
||||||
}
|
}
|
||||||
@@ -142,7 +144,7 @@ CreatureAI* GetAI_npc_sinclari(Creature* pCreature)
|
|||||||
bool GossipHello_npc_sinclari(Player* pPlayer, Creature* pCreature)
|
bool GossipHello_npc_sinclari(Player* pPlayer, Creature* pCreature)
|
||||||
{
|
{
|
||||||
ScriptedInstance* pInstance = pCreature->GetInstanceData();
|
ScriptedInstance* pInstance = pCreature->GetInstanceData();
|
||||||
if (pInstance && pInstance->GetData(DATA_WAVE_COUNT) == 0 && pPlayer)
|
if (pInstance && pInstance->GetData(DATA_CYANIGOSA_EVENT) != DONE && pInstance->GetData(DATA_WAVE_COUNT) == 0 && pPlayer)
|
||||||
{
|
{
|
||||||
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT,GOSSIP_ITEM_1,GOSSIP_SENDER_MAIN,GOSSIP_ACTION_INFO_DEF+2);
|
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT,GOSSIP_ITEM_1,GOSSIP_SENDER_MAIN,GOSSIP_ACTION_INFO_DEF+2);
|
||||||
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT,GOSSIP_START_EVENT,GOSSIP_SENDER_MAIN,GOSSIP_ACTION_INFO_DEF+1);
|
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT,GOSSIP_START_EVENT,GOSSIP_SENDER_MAIN,GOSSIP_ACTION_INFO_DEF+1);
|
||||||
@@ -189,6 +191,12 @@ struct TRINITY_DLL_DECL npc_teleportation_portalAI : public ScriptedAI
|
|||||||
|
|
||||||
void UpdateAI(const uint32 diff)
|
void UpdateAI(const uint32 diff)
|
||||||
{
|
{
|
||||||
|
if (pInstance && pInstance->GetData(DATA_REMOVE_NPC) == 1)
|
||||||
|
{
|
||||||
|
m_creature->ForcedDespawn();
|
||||||
|
pInstance->SetData(DATA_REMOVE_NPC, 0);
|
||||||
|
}
|
||||||
|
|
||||||
if (uiSpawnTimer <= diff)
|
if (uiSpawnTimer <= diff)
|
||||||
{
|
{
|
||||||
uint8 k = pInstance->GetData(DATA_WAVE_COUNT) < 12 ? 3 : 4;
|
uint8 k = pInstance->GetData(DATA_WAVE_COUNT) < 12 ? 3 : 4;
|
||||||
|
|||||||
@@ -22,7 +22,8 @@ enum Data
|
|||||||
DATA_1ST_BOSS_EVENT,
|
DATA_1ST_BOSS_EVENT,
|
||||||
DATA_2ND_BOSS_EVENT,
|
DATA_2ND_BOSS_EVENT,
|
||||||
DATA_CYANIGOSA_EVENT,
|
DATA_CYANIGOSA_EVENT,
|
||||||
DATA_WAVE_COUNT
|
DATA_WAVE_COUNT,
|
||||||
|
DATA_REMOVE_NPC
|
||||||
};
|
};
|
||||||
|
|
||||||
enum Data64
|
enum Data64
|
||||||
|
|||||||
Reference in New Issue
Block a user