diff options
Diffstat (limited to 'src')
4 files changed, 104 insertions, 14 deletions
diff --git a/src/bindings/scripts/scripts/northrend/violet_hold/boss_cyanigosa.cpp b/src/bindings/scripts/scripts/northrend/violet_hold/boss_cyanigosa.cpp index 25ca24cc3d7..8ac30af4e59 100644 --- a/src/bindings/scripts/scripts/northrend/violet_hold/boss_cyanigosa.cpp +++ b/src/bindings/scripts/scripts/northrend/violet_hold/boss_cyanigosa.cpp @@ -78,6 +78,12 @@ struct TRINITY_DLL_DECL boss_cyanigosaAI : public ScriptedAI 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 if (!UpdateVictim()) return; diff --git a/src/bindings/scripts/scripts/northrend/violet_hold/instance_violet_hold.cpp b/src/bindings/scripts/scripts/northrend/violet_hold/instance_violet_hold.cpp index 6f752eeec75..c54afa84198 100644 --- a/src/bindings/scripts/scripts/northrend/violet_hold/instance_violet_hold.cpp +++ b/src/bindings/scripts/scripts/northrend/violet_hold/instance_violet_hold.cpp @@ -76,12 +76,16 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance uint8 uiLocation; uint8 uiFirstBoss; uint8 uiSecondBoss; + uint8 uiRemoveNpc; uint8 m_auiEncounter[MAX_ENCOUNTER]; uint8 uiCountErekemGuards; uint8 uiCountActivationCrystals; + uint8 uiPlayersDead; + uint8 uiMaxPlayerCount; bool bActive; + bool bWiped; std::string str_data; @@ -105,6 +109,7 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance uiXevozzCell = 0; uiZuramatCell = 0; uiMainDoor = 0; + uiRemoveNpc = 0; uiWaveCount = 0; uiLocation = 0; @@ -112,10 +117,13 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance uiSecondBoss = 0; uiCountErekemGuards = 0; uiCountActivationCrystals = 0; + uiPlayersDead = 0; + uiMaxPlayerCount = 0; uiActivationTimer = 5000; bActive = false; + bWiped = false; memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); } @@ -228,6 +236,9 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance uiWaveCount = data; bActive = true; 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_CYANIGOSA_EVENT: return m_auiEncounter[2]; case DATA_WAVE_COUNT: return uiWaveCount; + case DATA_REMOVE_NPC: return uiRemoveNpc; } 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; switch(uiBoss) { case 0: //Moragg - HandleGameObject(uiMoraggCell,true); + HandleGameObject(uiMoraggCell,bForceRespawn); + if (pBoss = instance->GetCreature(uiMoragg)) { - 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_OOC_NOT_ATTACKABLE); + pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + } break; case 1: //Erekem - HandleGameObject(uiErekemCell,true); - HandleGameObject(uiErekemRightGuardCell,true); - HandleGameObject(uiErekemLeftGuardCell,true); + HandleGameObject(uiErekemCell,bForceRespawn); + HandleGameObject(uiErekemRightGuardCell,bForceRespawn); + HandleGameObject(uiErekemLeftGuardCell,bForceRespawn); + if (pBoss = instance->GetCreature(uiErekem)) { pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); @@ -297,7 +312,7 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance } break; case 2: //Ichoron - HandleGameObject(uiIchoronCell,true); + HandleGameObject(uiIchoronCell,bForceRespawn); if (pBoss = instance->GetCreature(uiIchoron)) { pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); @@ -305,7 +320,7 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance } break; case 3: //Lavanthor - HandleGameObject(uiLavanthorCell,true); + HandleGameObject(uiLavanthorCell,bForceRespawn); if (pBoss = instance->GetCreature(uiLavanthor)) { pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); @@ -313,7 +328,7 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance } break; case 4: //Xevozz - HandleGameObject(uiXevozzCell,true); + HandleGameObject(uiXevozzCell,bForceRespawn); if (pBoss = instance->GetCreature(uiXevozz)) { pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); @@ -321,7 +336,7 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance } break; case 5: //Zuramat - HandleGameObject(uiZuramatCell,true); + HandleGameObject(uiZuramatCell,bForceRespawn); if (pBoss = instance->GetCreature(uiZuramat)) { pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); @@ -329,6 +344,16 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance } 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() @@ -360,7 +385,9 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance pMainDoor->SetGoState(GO_STATE_READY); } default: - SpawnPortal(); + if (!bWiped) + SpawnPortal(); + bWiped = false; } bActive = true; } @@ -440,8 +467,35 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance 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) { + if (!instance->HavePlayers()) + return; + if (bActive) { if (uiActivationTimer < diff) @@ -451,6 +505,27 @@ struct TRINITY_DLL_DECL instance_violet_hold : public ScriptedInstance uiActivationTimer = 5000; } 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); + } } }; diff --git a/src/bindings/scripts/scripts/northrend/violet_hold/violet_hold.cpp b/src/bindings/scripts/scripts/northrend/violet_hold/violet_hold.cpp index 301daeab58e..b41ac0c2ed3 100644 --- a/src/bindings/scripts/scripts/northrend/violet_hold/violet_hold.cpp +++ b/src/bindings/scripts/scripts/northrend/violet_hold/violet_hold.cpp @@ -55,6 +55,8 @@ struct TRINITY_DLL_DECL npc_sinclariAI : public ScriptedAI { if (Creature* pGuard = *itr) { + pGuard->DisappearAndDie(); + pGuard->Respawn(); pGuard->SetVisibility(VISIBILITY_ON); pGuard->SetReactState(REACT_AGGRESSIVE); } @@ -142,7 +144,7 @@ CreatureAI* GetAI_npc_sinclari(Creature* pCreature) bool GossipHello_npc_sinclari(Player* pPlayer, Creature* pCreature) { 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_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) { + if (pInstance && pInstance->GetData(DATA_REMOVE_NPC) == 1) + { + m_creature->ForcedDespawn(); + pInstance->SetData(DATA_REMOVE_NPC, 0); + } + if (uiSpawnTimer <= diff) { uint8 k = pInstance->GetData(DATA_WAVE_COUNT) < 12 ? 3 : 4; diff --git a/src/bindings/scripts/scripts/northrend/violet_hold/violet_hold.h b/src/bindings/scripts/scripts/northrend/violet_hold/violet_hold.h index 31ca883a1a7..187ab28036b 100644 --- a/src/bindings/scripts/scripts/northrend/violet_hold/violet_hold.h +++ b/src/bindings/scripts/scripts/northrend/violet_hold/violet_hold.h @@ -22,7 +22,8 @@ enum Data DATA_1ST_BOSS_EVENT, DATA_2ND_BOSS_EVENT, DATA_CYANIGOSA_EVENT, - DATA_WAVE_COUNT + DATA_WAVE_COUNT, + DATA_REMOVE_NPC }; enum Data64 |
