From d113ad05228932ee36614edaba4c7ac86f4657fa Mon Sep 17 00:00:00 2001 From: GuybrushGit Date: Sat, 21 Apr 2018 07:37:37 +0100 Subject: [PATCH] Refactor encounter in progress check (#47) * Refactor encounter in progress check * Encounter in progress kick player on login * Molten Core & Onyxia's Lair * Bug Trio and Huhuran * AQ20 encounters * ZG encounters * BWL & Naxxramas * Onyxia SetData bug * Add comment about why we're not using MAX_ENCOUNTER * Random finger mashing --- sql/migrations/20180408015542_world.sql | 18 +++++ src/game/Group/Group.cpp | 2 +- src/game/Handlers/CharacterHandler.cpp | 2 + src/game/Maps/Map.cpp | 14 ++-- src/game/Maps/MapManager.cpp | 8 -- src/scripts/ScriptLoader.cpp | 2 + .../blackwing_lair/boss_flamegor.cpp | 5 -- .../instance_blackwing_lair.cpp | 4 +- .../molten_core/instance_molten_core.cpp | 4 + .../naxxramas/boss_sapphiron.cpp | 3 + .../zulgurub/boss_gahzranka.cpp | 15 +++- .../zulgurub/boss_hakkar.cpp | 16 ++++ .../zulgurub/boss_jindo.cpp | 7 ++ .../zulgurub/boss_thekal.cpp | 32 ++++---- .../zulgurub/boss_venoxis.cpp | 9 +++ .../zulgurub/instance_zulgurub.cpp | 25 +++--- .../stranglethorn_vale/zulgurub/zulgurub.h | 32 ++++---- .../onyxias_lair/instance_onyxia_lair.cpp | 76 +------------------ .../onyxias_lair/instance_onyxia_lair.h | 12 +-- .../ruins_of_ahnqiraj/boss_ayamiss.cpp | 14 ++++ .../silithus/ruins_of_ahnqiraj/boss_buru.cpp | 8 ++ .../silithus/ruins_of_ahnqiraj/boss_moam.cpp | 13 ++++ .../ruins_of_ahnqiraj/boss_ossirian.cpp | 2 + .../instance_ruins_of_ahnqiraj.cpp | 19 ++++- .../ruins_of_ahnqiraj/ruins_of_ahnqiraj.h | 10 +-- .../temple_of_ahnqiraj/boss_bug_trio.cpp | 8 +- .../temple_of_ahnqiraj/boss_huhuran.cpp | 12 +++ .../instance_temple_of_ahnqiraj.cpp | 6 +- 28 files changed, 217 insertions(+), 161 deletions(-) create mode 100644 sql/migrations/20180408015542_world.sql diff --git a/sql/migrations/20180408015542_world.sql b/sql/migrations/20180408015542_world.sql new file mode 100644 index 000000000..a62ece838 --- /dev/null +++ b/sql/migrations/20180408015542_world.sql @@ -0,0 +1,18 @@ +DROP PROCEDURE IF EXISTS add_migration; +delimiter ?? +CREATE PROCEDURE `add_migration`() +BEGIN +DECLARE v INT DEFAULT 1; +SET v = (SELECT COUNT(*) FROM `migrations` WHERE `id`='20180408015542'); +IF v=0 THEN +INSERT INTO `migrations` VALUES ('20180408015542'); +-- Add your query below. + +UPDATE `map_template` SET `ScriptName`='instance_onyxia_lair' WHERE `Entry`=249; + +-- End of migration. +END IF; +END?? +delimiter ; +CALL add_migration(); +DROP PROCEDURE IF EXISTS add_migration; diff --git a/src/game/Group/Group.cpp b/src/game/Group/Group.cpp index a03e2882a..0176c0e8f 100644 --- a/src/game/Group/Group.cpp +++ b/src/game/Group/Group.cpp @@ -1915,7 +1915,7 @@ bool Group::InCombatToInstance(uint32 instanceId) for (GroupReference *itr = GetFirstMember(); itr != NULL; itr = itr->next()) { Player *pPlayer = itr->getSource(); - if (pPlayer->getAttackers().size() && pPlayer->GetInstanceId() == instanceId) + if (pPlayer->isInCombat() && pPlayer->GetInstanceId() == instanceId) return true; } return false; diff --git a/src/game/Handlers/CharacterHandler.cpp b/src/game/Handlers/CharacterHandler.cpp index 87cf09ea9..8bf786efa 100644 --- a/src/game/Handlers/CharacterHandler.cpp +++ b/src/game/Handlers/CharacterHandler.cpp @@ -619,6 +619,8 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder *holder) AreaTrigger const* at = sObjectMgr.GetGoBackTrigger(pCurrChar->GetMapId()); if (at) pCurrChar->TeleportTo(at->target_mapId, at->target_X, at->target_Y, at->target_Z, pCurrChar->GetOrientation()); + else if (pCurrChar->GetMapId() == 533) + pCurrChar->TeleportTo(0, 3120.16f, -3724.93f, 137.66f, 5.83567f); // Naxxramas has no exit trigger else pCurrChar->TeleportToHomebind(); diff --git a/src/game/Maps/Map.cpp b/src/game/Maps/Map.cpp index ce6a8fbe7..8fe1f5155 100644 --- a/src/game/Maps/Map.cpp +++ b/src/game/Maps/Map.cpp @@ -1814,16 +1814,13 @@ bool DungeonMap::CanEnter(Player *player) return false; } - // cannot enter while players in the instance are in combat + // cannot enter while an encounter is in progress Group *pGroup = player->GetGroup(); - if (pGroup && pGroup->InCombatToInstance(GetInstanceId()) && player->isAlive() && player->GetMapId() != GetId()) + if (IsRaid() && GetInstanceData() && GetInstanceData()->IsEncounterInProgress() && + pGroup && pGroup->InCombatToInstance(GetInstanceId()) && player->isAlive() && !player->isGameMaster()) { - - if (GetId() == 249 || GetId() == 531 || GetId() == 533) // Hack : Ustaag : concerne uniquement Onyxia's Lair - { - player->SendTransferAborted(TRANSFER_ABORT_ZONE_IN_COMBAT); - return false; - } + player->SendTransferAborted(TRANSFER_ABORT_ZONE_IN_COMBAT); + return false; } if (GetId() == 509 || GetId() == 531) @@ -1835,7 +1832,6 @@ bool DungeonMap::CanEnter(Player *player) } } - return Map::CanEnter(player); } diff --git a/src/game/Maps/MapManager.cpp b/src/game/Maps/MapManager.cpp index a6afca136..992c2c93b 100644 --- a/src/game/Maps/MapManager.cpp +++ b/src/game/Maps/MapManager.cpp @@ -208,14 +208,6 @@ bool MapManager::CanPlayerEnter(uint32 mapid, Player* player) player->SendTransferAborted(TRANSFER_ABORT_TOO_MANY_INSTANCES); return false; } - - // TODO: move this to a map dependent location - /*if(i_data && i_data->IsEncounterInProgress()) - { - DEBUG_LOG("MAP: Player '%s' can't enter instance '%s' while an encounter is in progress.", player->GetName(), GetMapName()); - player->SendTransferAborted(TRANSFER_ABORT_ZONE_IN_COMBAT); - return(false); - }*/ } return true; diff --git a/src/scripts/ScriptLoader.cpp b/src/scripts/ScriptLoader.cpp index 8b4d2c940..6ae92ae54 100644 --- a/src/scripts/ScriptLoader.cpp +++ b/src/scripts/ScriptLoader.cpp @@ -220,6 +220,7 @@ void AddSC_boss_noxxion(); void AddSC_boss_ptheradras(); void AddSC_maraudon(); void AddSC_instance_maraudon(); +void AddSC_instance_onyxia_lair(); void AddSC_boss_onyxia(); //onyxias_lair void AddSC_boss_amnennar_the_coldbringer(); //razorfen_downs void AddSC_razorfen_downs(); @@ -493,6 +494,7 @@ void AddScripts() AddSC_boss_ptheradras(); AddSC_maraudon(); AddSC_instance_maraudon(); + AddSC_instance_onyxia_lair(); AddSC_boss_onyxia(); //onyxias_lair AddSC_boss_amnennar_the_coldbringer(); //razorfen_downs AddSC_razorfen_downs(); diff --git a/src/scripts/eastern_kingdoms/burning_steppes/blackwing_lair/boss_flamegor.cpp b/src/scripts/eastern_kingdoms/burning_steppes/blackwing_lair/boss_flamegor.cpp index 55cad16f0..3b200630c 100644 --- a/src/scripts/eastern_kingdoms/burning_steppes/blackwing_lair/boss_flamegor.cpp +++ b/src/scripts/eastern_kingdoms/burning_steppes/blackwing_lair/boss_flamegor.cpp @@ -50,11 +50,6 @@ struct boss_flamegorAI : public ScriptedAI uint32 m_uiWingBuffetTimer; uint32 m_uiFrenzyTimer; - void EnterCombat(Unit* /*pWho*/) - { - m_creature->SetInCombatWithZone(); - } - void Reset() { m_uiShadowFlameTimer = 16000; // These times are probably wrong diff --git a/src/scripts/eastern_kingdoms/burning_steppes/blackwing_lair/instance_blackwing_lair.cpp b/src/scripts/eastern_kingdoms/burning_steppes/blackwing_lair/instance_blackwing_lair.cpp index 481820520..bd9afb892 100644 --- a/src/scripts/eastern_kingdoms/burning_steppes/blackwing_lair/instance_blackwing_lair.cpp +++ b/src/scripts/eastern_kingdoms/burning_steppes/blackwing_lair/instance_blackwing_lair.cpp @@ -273,7 +273,9 @@ struct instance_blackwing_lair : public ScriptedInstance bool IsEncounterInProgress() const { - for (int i = 0; i < MAX_ENCOUNTER; i++) + // Don't include TYPE_SCEPTER_RUN status in encounter progress check + // TODO: Move scepter run out of encounter ordering + for (int i = 0; i < TYPE_VAEL_EVENT; i++) { if (m_auiEncounter[i] == IN_PROGRESS) return true; diff --git a/src/scripts/eastern_kingdoms/burning_steppes/molten_core/instance_molten_core.cpp b/src/scripts/eastern_kingdoms/burning_steppes/molten_core/instance_molten_core.cpp index 4bfa77d65..310295b95 100644 --- a/src/scripts/eastern_kingdoms/burning_steppes/molten_core/instance_molten_core.cpp +++ b/src/scripts/eastern_kingdoms/burning_steppes/molten_core/instance_molten_core.cpp @@ -92,6 +92,10 @@ struct instance_molten_core : ScriptedInstance bool IsEncounterInProgress() const override { + for (uint8 i = 0; i < INSTANCE_MC_MAX_ENCOUNTER; ++i) + if (m_auiEncounter[i] == IN_PROGRESS || m_auiEncounter[i] == SPECIAL) + return true; + return false; } diff --git a/src/scripts/eastern_kingdoms/eastern_plaguelands/naxxramas/boss_sapphiron.cpp b/src/scripts/eastern_kingdoms/eastern_plaguelands/naxxramas/boss_sapphiron.cpp index 5f9ac5e98..88f0e3a8e 100644 --- a/src/scripts/eastern_kingdoms/eastern_plaguelands/naxxramas/boss_sapphiron.cpp +++ b/src/scripts/eastern_kingdoms/eastern_plaguelands/naxxramas/boss_sapphiron.cpp @@ -159,6 +159,9 @@ struct boss_sapphironAI : public ScriptedAI setHover(false, true); SetCombatMovement(true); m_TargetNotReachableTimer = 0; + + if (m_pInstance && m_pInstance->GetData(TYPE_SAPPHIRON) != DONE) + m_pInstance->SetData(TYPE_SAPPHIRON, NOT_STARTED); } void UnSummonWingBuffet() diff --git a/src/scripts/eastern_kingdoms/stranglethorn_vale/zulgurub/boss_gahzranka.cpp b/src/scripts/eastern_kingdoms/stranglethorn_vale/zulgurub/boss_gahzranka.cpp index b85125c58..1b9fa34af 100644 --- a/src/scripts/eastern_kingdoms/stranglethorn_vale/zulgurub/boss_gahzranka.cpp +++ b/src/scripts/eastern_kingdoms/stranglethorn_vale/zulgurub/boss_gahzranka.cpp @@ -61,6 +61,19 @@ struct boss_gahzrankaAI : public ScriptedAI Frostbreath_Timer = 8000; MassiveGeyser_Timer = 25000; Slam_Timer = 17000; + + if (m_pInstance && m_pInstance->GetData(TYPE_GAHZRANKA) != DONE) + m_pInstance->SetData(TYPE_GAHZRANKA, NOT_STARTED); + } + void Aggro(Unit *who) + { + if (m_pInstance) + m_pInstance->SetData(TYPE_GAHZRANKA, IN_PROGRESS); + } + void JustDied(Unit* Killer) + { + if (m_pInstance) + m_pInstance->SetData(TYPE_GAHZRANKA, DONE); } void JustRespawned() @@ -73,7 +86,7 @@ struct boss_gahzrankaAI : public ScriptedAI if (!m_pInstance) return; - if (m_pInstance->GetData(TYPE_GAHZRANKA) != DONE) + if (m_pInstance->GetData(TYPE_GAHZRANKA) != IN_PROGRESS) { m_creature->DisappearAndDie(); m_creature->SetRespawnTime(259200); diff --git a/src/scripts/eastern_kingdoms/stranglethorn_vale/zulgurub/boss_hakkar.cpp b/src/scripts/eastern_kingdoms/stranglethorn_vale/zulgurub/boss_hakkar.cpp index b45dbeaa8..9dafdf89e 100644 --- a/src/scripts/eastern_kingdoms/stranglethorn_vale/zulgurub/boss_hakkar.cpp +++ b/src/scripts/eastern_kingdoms/stranglethorn_vale/zulgurub/boss_hakkar.cpp @@ -115,6 +115,22 @@ struct boss_hakkarAI : public ScriptedAI AspectOfArlokk_Timer = 18000; Enraged = false; + + if (m_pInstance) + m_pInstance->SetData(TYPE_HAKKAR, NOT_STARTED); + } + + void Aggro(Unit *who) + { + if (m_pInstance) + m_pInstance->SetData(TYPE_HAKKAR, IN_PROGRESS); + ScriptedAI::Aggro(who); + } + + void JustDied(Unit* Killer) + { + if (m_pInstance) + m_pInstance->SetData(TYPE_HAKKAR, DONE); } void UpdateAI(const uint32 diff) diff --git a/src/scripts/eastern_kingdoms/stranglethorn_vale/zulgurub/boss_jindo.cpp b/src/scripts/eastern_kingdoms/stranglethorn_vale/zulgurub/boss_jindo.cpp index 4c5fb2f92..5c37a9e70 100644 --- a/src/scripts/eastern_kingdoms/stranglethorn_vale/zulgurub/boss_jindo.cpp +++ b/src/scripts/eastern_kingdoms/stranglethorn_vale/zulgurub/boss_jindo.cpp @@ -119,6 +119,9 @@ struct boss_jindoAI : public ScriptedAI BrainWashedPlayerAggro.clear(); DespawnAllSummons(); + + if (m_pInstance) + m_pInstance->SetData(TYPE_JINDO, NOT_STARTED); } void SpellHitTarget(Unit* pCaster, const SpellEntry* pSpell) @@ -138,11 +141,15 @@ struct boss_jindoAI : public ScriptedAI void JustDied(Unit* pKiller) { DespawnAllSummons(); + if (m_pInstance) + m_pInstance->SetData(TYPE_JINDO, DONE); } void Aggro(Unit *who) { DoScriptText(SAY_AGGRO, m_creature); + if (m_pInstance) + m_pInstance->SetData(TYPE_JINDO, IN_PROGRESS); } void DoSummonSkeleton(float addx, float addy, Unit* initialTarget) diff --git a/src/scripts/eastern_kingdoms/stranglethorn_vale/zulgurub/boss_thekal.cpp b/src/scripts/eastern_kingdoms/stranglethorn_vale/zulgurub/boss_thekal.cpp index 9ab00f864..6c751a771 100644 --- a/src/scripts/eastern_kingdoms/stranglethorn_vale/zulgurub/boss_thekal.cpp +++ b/src/scripts/eastern_kingdoms/stranglethorn_vale/zulgurub/boss_thekal.cpp @@ -121,6 +121,12 @@ struct zg_rez_add : public ScriptedAI { return _realyDead; } + void Aggro(Unit *who) + { + if (m_pInstance) + m_pInstance->SetData(m_uiInstMobType, IN_PROGRESS); + ScriptedAI::Aggro(who); + } void JustDied(Unit* Killer) { @@ -130,7 +136,6 @@ struct zg_rez_add : public ScriptedAI m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); if (m_pInstance) { - m_pInstance->SetData(m_uiInstMobType, SPECIAL); pRezzer = m_pInstance->Thekal_GetUnitThatCanRez(); } if (pRezzer) @@ -213,6 +218,8 @@ struct zg_rez_add : public ScriptedAI } void Reset() { + if (m_pInstance) + m_pInstance->SetData(m_uiInstMobType, NOT_STARTED); } uint32 m_uiInstMobType; @@ -299,11 +306,6 @@ struct boss_thekalAI : public zg_rez_add Enraged = false; - if (m_pInstance) - { - m_pInstance->SetData(TYPE_LORKHAN, SPECIAL); - m_pInstance->SetData(TYPE_ZATH, SPECIAL); - } // Si en phase 2 avant de reset, faut repop les 2 adds. m_creature->RespawnNearCreaturesByEntry(ZELOTH_LOR_KHAN, 100.0f); m_creature->RespawnNearCreaturesByEntry(ZELOTH_ZATH, 100.0f); @@ -320,7 +322,11 @@ struct boss_thekalAI : public zg_rez_add DEBUG_UNIT(m_creature, DEBUG_AI, "Thekal is dead for real"); if (m_pInstance) + { + m_pInstance->SetData(TYPE_LORKHAN, DONE); + m_pInstance->SetData(TYPE_ZATH, DONE); m_pInstance->SetData(TYPE_THEKAL, DONE); + } ScriptedAI::JustDied(Killer); } @@ -370,6 +376,8 @@ struct boss_thekalAI : public zg_rez_add void Aggro(Unit *who) { + if (m_pInstance) + m_pInstance->SetData(TYPE_THEKAL, IN_PROGRESS); if (PhaseTwo) DoScriptText(SAY_AGGRO, m_creature); m_creature->SetInCombatWithZone(); @@ -394,12 +402,6 @@ struct boss_thekalAI : public zg_rez_add m_creature->DespawnNearCreaturesByEntry(ZELOTH_ZATH, 100.0f); } - void JustReachedHome() - { - if (m_pInstance) - m_pInstance->SetData(TYPE_THEKAL, NOT_STARTED); - } - void CheckTiger(uint64& guid) { Creature* pTiger = m_creature->GetMap()->GetCreature(guid); @@ -552,9 +554,6 @@ struct mob_zealot_lorkhanAI : public zg_rez_add Resurrect_Timer = 10000; uiRezzeurGUID = 0; - if (m_pInstance) - m_pInstance->SetData(TYPE_LORKHAN, NOT_STARTED); - m_creature->SetStandState(UNIT_STAND_STATE_STAND); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); zg_rez_add::Reset(); @@ -653,9 +652,6 @@ struct mob_zealot_zathAI : public zg_rez_add Resurrect_Timer = 10000; uiRezzeurGUID = 0; - if (m_pInstance) - m_pInstance->SetData(TYPE_ZATH, NOT_STARTED); - m_creature->SetStandState(UNIT_STAND_STATE_STAND); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); zg_rez_add::Reset(); diff --git a/src/scripts/eastern_kingdoms/stranglethorn_vale/zulgurub/boss_venoxis.cpp b/src/scripts/eastern_kingdoms/stranglethorn_vale/zulgurub/boss_venoxis.cpp index 14c847c94..33864a5d3 100644 --- a/src/scripts/eastern_kingdoms/stranglethorn_vale/zulgurub/boss_venoxis.cpp +++ b/src/scripts/eastern_kingdoms/stranglethorn_vale/zulgurub/boss_venoxis.cpp @@ -117,6 +117,12 @@ struct boss_venoxisAI : public ScriptedAI } } + void Aggro(Unit* pWho) + { + if (m_pInstance) + m_pInstance->SetData(TYPE_VENOXIS, IN_PROGRESS); + } + void JustReachedHome() { std::list m_lCobras; @@ -132,6 +138,9 @@ struct boss_venoxisAI : public ScriptedAI (*iter)->Respawn(); } } + + if (m_pInstance) + m_pInstance->SetData(TYPE_VENOXIS, NOT_STARTED); } void JustDied(Unit* pKiller) diff --git a/src/scripts/eastern_kingdoms/stranglethorn_vale/zulgurub/instance_zulgurub.cpp b/src/scripts/eastern_kingdoms/stranglethorn_vale/zulgurub/instance_zulgurub.cpp index f1b1f25e3..56fbf7a9d 100644 --- a/src/scripts/eastern_kingdoms/stranglethorn_vale/zulgurub/instance_zulgurub.cpp +++ b/src/scripts/eastern_kingdoms/stranglethorn_vale/zulgurub/instance_zulgurub.cpp @@ -59,9 +59,11 @@ void instance_zulgurub::LowerHakkarHitPoints() } } -bool instance_zulgurub::IsEncounterInProgress() +bool instance_zulgurub::IsEncounterInProgress() const { - //not active in Zul'Gurub + for (uint8 i = 0; i < ZULGURUB_MAX_ENCOUNTER; ++i) + if (m_auiEncounter[i] == IN_PROGRESS || m_auiEncounter[i] == SPECIAL) + return true; return false; } @@ -192,15 +194,18 @@ void instance_zulgurub::SetData(uint32 uiType, uint32 uiData) else m_auiEncounter[9] = uiData; break; - case TYPE_GAHZRANKA: + case TYPE_JINDO: m_auiEncounter[10] = uiData; break; + case TYPE_GAHZRANKA: + m_auiEncounter[11] = uiData; + break; } if (uiData == DONE) { OUT_SAVE_INST_DATA; - strInstData = GenSaveData(m_auiEncounter, 10); + strInstData = GenSaveData(m_auiEncounter, 11); SaveToDB(); OUT_SAVE_INST_DATA_COMPLETE; } @@ -221,7 +226,7 @@ void instance_zulgurub::Load(const char* chrIn) OUT_LOAD_INST_DATA(chrIn); - LoadSaveData(chrIn, m_auiEncounter, 10); + LoadSaveData(chrIn, m_auiEncounter, 11); for (uint8 i = 0; i < ZULGURUB_MAX_ENCOUNTER; ++i) { @@ -260,8 +265,10 @@ uint32 instance_zulgurub::GetData(uint32 uiType) if (m_auiEncounter[9] >= 15080 && m_auiEncounter[9] <= 15085) return m_auiEncounter[9]; return 0; - case TYPE_GAHZRANKA: + case TYPE_JINDO: return m_auiEncounter[10]; + case TYPE_GAHZRANKA: + return m_auiEncounter[11]; } return 0; } @@ -289,7 +296,7 @@ uint64 instance_zulgurub::GetData64(uint32 uiData) void instance_zulgurub::Create() { m_auiEncounter[9] = GenerateRandomBoss(); - strInstData = GenSaveData(m_auiEncounter, 10); + strInstData = GenSaveData(m_auiEncounter, 11); SaveToDB(); if (!m_randomBossSpawned) SpawnRandomBoss(); @@ -503,15 +510,15 @@ bool ProcessEventId_event_summon_gahzranka(uint32 uiEventId, Object* pSource, Ob if (ScriptedInstance* m_pInstance = dynamic_cast(pPlayer->GetInstanceData())) { // return if already summoned - if (m_pInstance->GetData(TYPE_GAHZRANKA) == DONE) + if (m_pInstance->GetData(TYPE_GAHZRANKA) != NOT_STARTED) return false; pPlayer->CastSpell(pPlayer, 12816, true); if (Creature* pCreature = m_pInstance->instance->GetCreature(m_pInstance->GetData64(DATA_GAHZRANKA))) { + m_pInstance->SetData(TYPE_GAHZRANKA, IN_PROGRESS); pCreature->Respawn(); - m_pInstance->SetData(TYPE_GAHZRANKA, DONE); return true; } } diff --git a/src/scripts/eastern_kingdoms/stranglethorn_vale/zulgurub/zulgurub.h b/src/scripts/eastern_kingdoms/stranglethorn_vale/zulgurub/zulgurub.h index 4be86f327..cd4b45f7f 100644 --- a/src/scripts/eastern_kingdoms/stranglethorn_vale/zulgurub/zulgurub.h +++ b/src/scripts/eastern_kingdoms/stranglethorn_vale/zulgurub/zulgurub.h @@ -7,7 +7,7 @@ enum { - ZULGURUB_MAX_ENCOUNTER = 11, + ZULGURUB_MAX_ENCOUNTER = 13, NPC_LORKHAN = 11347, NPC_ZATH = 11348, @@ -33,15 +33,15 @@ enum TYPE_LORKHAN = 8, TYPE_HAKKAR = 9, TYPE_RANDOM_BOSS = 10, + TYPE_JINDO = 11, + TYPE_GAHZRANKA = 12, - DATA_JINDO = 11, - DATA_LORKHAN = 12, - DATA_THEKAL = 13, - DATA_ZATH = 14, - DATA_HAKKAR = 15, - - TYPE_GAHZRANKA = 16, - DATA_GAHZRANKA = 17 + DATA_JINDO = 13, + DATA_LORKHAN = 14, + DATA_THEKAL = 15, + DATA_ZATH = 16, + DATA_HAKKAR = 17, + DATA_GAHZRANKA = 18 }; class instance_zulgurub : public ScriptedInstance @@ -50,15 +50,15 @@ class instance_zulgurub : public ScriptedInstance instance_zulgurub(Map* pMap) : ScriptedInstance(pMap), m_randomBossSpawned(false) {Initialize();}; void Initialize(); - void Create(); + void Create(); - bool IsEncounterInProgress(); + bool IsEncounterInProgress() const override; void OnCreatureCreate(Creature* pCreature); - void OnCreatureDeath(Creature * pCreature); + void OnCreatureDeath(Creature * pCreature); void SetData(uint32 uiType, uint32 uiData); const char* Save(); void Load(const char* chrIn); - void HandleLoadCreature(uint32 dataType, uint64 &storeGuid, Creature* pCrea); // Nostalrius + void HandleLoadCreature(uint32 dataType, uint64 &storeGuid, Creature* pCrea); // Nostalrius uint32 GetData(uint32 uiType); uint64 GetData64(uint32 uiData); @@ -71,8 +71,8 @@ class instance_zulgurub : public ScriptedInstance protected: std::string strInstData; - bool m_randomBossSpawned; - uint32 randomBossEntry; + bool m_randomBossSpawned; + uint32 randomBossEntry; // If all High Priest bosses were killed. Lorkhan, Zath and Ohgan are added too. uint32 m_auiEncounter[ZULGURUB_MAX_ENCOUNTER]; @@ -85,7 +85,7 @@ class instance_zulgurub : public ScriptedInstance uint64 m_uiGahzrankaGUID; uint64 m_uiMarliGUID; - std::list m_lMarliTrashGUIDList; + std::list m_lMarliTrashGUIDList; }; #endif diff --git a/src/scripts/kalimdor/dustwallow_marsh/onyxias_lair/instance_onyxia_lair.cpp b/src/scripts/kalimdor/dustwallow_marsh/onyxias_lair/instance_onyxia_lair.cpp index f15f0ae3c..8a9c33fc3 100644 --- a/src/scripts/kalimdor/dustwallow_marsh/onyxias_lair/instance_onyxia_lair.cpp +++ b/src/scripts/kalimdor/dustwallow_marsh/onyxias_lair/instance_onyxia_lair.cpp @@ -11,18 +11,7 @@ struct instance_onyxia_lair : public ScriptedInstance }; uint32 m_auiEncounter[MAX_ENCOUNTER]; - uint32 m_uiOnyxiaGUID; - uint32 m_uiOnyxiaDoorGUID; - uint32 m_uiOnyxiaEncounterDoorGUID; - - - - void Initialize() - { - m_uiOnyxiaGUID = 0; - m_uiOnyxiaDoorGUID = 0; - m_uiOnyxiaEncounterDoorGUID = 0; - } + void Initialize() { } bool IsEncounterInProgress() const { @@ -42,62 +31,15 @@ struct instance_onyxia_lair : public ScriptedInstance return 0; } - void SetData(uint32 identifier, uint32 data) + void SetData(uint32 uiType, uint32 uiData) override { - switch (identifier) + switch (uiType) { case DATA_ONYXIA_EVENT: - if (data == IN_PROGRESS) - { - sLog.outString("Fermeture de l'instance pendant le combat contre Onyxia"); - if (m_uiOnyxiaDoorGUID) - if (GameObject *pGo = instance->GetGameObject(m_uiOnyxiaDoorGUID)) - pGo->SetGoState(GO_STATE_READY); - } - if (data == NOT_STARTED) - { - sLog.outString("Arrets des combats: ouverture de l'instance"); - if (m_uiOnyxiaDoorGUID) - if (GameObject *pGo = instance->GetGameObject(m_uiOnyxiaDoorGUID)) - pGo->SetGoState(GO_STATE_ACTIVE); - } - m_auiEncounter[0] = data; + m_auiEncounter[0] = uiData; break; } } - - void OnCreatureCreate(Creature* pCreature) - { - switch (pCreature->GetEntry()) - { - case 10184: - m_uiOnyxiaGUID = pCreature->GetGUID(); - break; - } - } - - void OnObjectCreate(GameObject* go) - { - switch (go->GetEntry()) - { - case 177928: - m_uiOnyxiaDoorGUID = go->GetGUID(); - break; - } - } - uint64 GetData64(uint32 identifier) - { - switch (identifier) - { - case DATA_ONYXIA: - return m_uiOnyxiaGUID; - case DATA_ONYXIA_DOOR: - return m_uiOnyxiaDoorGUID; - case DATA_ONYXIA_ENCOUNTER_DOOR: - return m_uiOnyxiaEncounterDoorGUID; - } - return 0; - } }; InstanceData* GetInstanceData_instance_onyxia_lair(Map* pMap) @@ -114,13 +56,3 @@ void AddSC_instance_onyxia_lair() newscript->GetInstanceData = &GetInstanceData_instance_onyxia_lair; newscript->RegisterSelf(); } - - - - - - - - - - diff --git a/src/scripts/kalimdor/dustwallow_marsh/onyxias_lair/instance_onyxia_lair.h b/src/scripts/kalimdor/dustwallow_marsh/onyxias_lair/instance_onyxia_lair.h index 40b764b1a..6a736a23b 100644 --- a/src/scripts/kalimdor/dustwallow_marsh/onyxias_lair/instance_onyxia_lair.h +++ b/src/scripts/kalimdor/dustwallow_marsh/onyxias_lair/instance_onyxia_lair.h @@ -1,12 +1,6 @@ -#ifndef DEF_MAGISTERS_TERRACE_H -#define DEF_MAGISTERS_TERRACE_H +#ifndef DEF_ONYXIA_LAIR_H +#define DEF_ONYXIA_LAIR_H -#define DATA_ONYXIA_EVENT 1 +#define DATA_ONYXIA_EVENT 0 -#define DATA_ONYXIA 2 - -#define DATA_ONYXIA_DOOR 3 -#define DATA_ONYXIA_ENCOUNTER_DOOR 4 - -#define ERROR_INST_DATA "SD2 Error: Instance Data not set properly for Onyxia's Lair. Encounters will be buggy." #endif diff --git a/src/scripts/kalimdor/silithus/ruins_of_ahnqiraj/boss_ayamiss.cpp b/src/scripts/kalimdor/silithus/ruins_of_ahnqiraj/boss_ayamiss.cpp index 766090893..09e561541 100644 --- a/src/scripts/kalimdor/silithus/ruins_of_ahnqiraj/boss_ayamiss.cpp +++ b/src/scripts/kalimdor/silithus/ruins_of_ahnqiraj/boss_ayamiss.cpp @@ -72,9 +72,12 @@ struct boss_ayamissAI : public ScriptedAI { boss_ayamissAI(Creature* pCreature) : ScriptedAI(pCreature) { + m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); Reset(); } + ScriptedInstance* m_pInstance; + uint32 m_uiStingerSpray_Timer; uint32 m_uiPoisonStinger_Timer; uint32 m_uiSummonSwarmer_Timer; @@ -133,10 +136,21 @@ struct boss_ayamissAI : public ScriptedAI if ((*itr)->isAlive()) (*itr)->AddObjectToRemoveList(); } + + if (m_pInstance) + m_pInstance->SetData(TYPE_AYAMISS, NOT_STARTED); } void Aggro(Unit* pWho) { + if (m_pInstance) + m_pInstance->SetData(TYPE_AYAMISS, IN_PROGRESS); + } + + void JustDied(Unit* pKiller) + { + if (m_pInstance) + m_pInstance->SetData(TYPE_AYAMISS, DONE); } void SpellHitTarget(Unit* pCaster, const SpellEntry* pSpell) diff --git a/src/scripts/kalimdor/silithus/ruins_of_ahnqiraj/boss_buru.cpp b/src/scripts/kalimdor/silithus/ruins_of_ahnqiraj/boss_buru.cpp index e6fe43890..7dcf83655 100644 --- a/src/scripts/kalimdor/silithus/ruins_of_ahnqiraj/boss_buru.cpp +++ b/src/scripts/kalimdor/silithus/ruins_of_ahnqiraj/boss_buru.cpp @@ -109,6 +109,9 @@ struct boss_buruAI : public ScriptedAI if (Creature* egg = m_creature->SummonCreature(NPC_BURU_EGG, Eggs[i].x, Eggs[i].y, Eggs[i].z, 0)) m_eggsGUID[i] = egg->GetGUID(); } + + if (m_pInstance) + m_pInstance->SetData(TYPE_BURU, NOT_STARTED); } void Aggro(Unit *pWho) @@ -116,6 +119,8 @@ struct boss_buruAI : public ScriptedAI m_creature->SetInCombatWithZone(); DoCast(m_creature, SPELL_THORNS); m_creature->SetArmor(20000); + if (m_pInstance) + m_pInstance->SetData(TYPE_BURU, IN_PROGRESS); } void JustDied(Unit* pKiller) @@ -124,6 +129,9 @@ struct boss_buruAI : public ScriptedAI Map::PlayerList const &liste = m_creature->GetMap()->GetPlayers(); for (Map::PlayerList::const_iterator i = liste.begin(); i != liste.end(); ++i) i->getSource()->RemoveAurasDueToSpell(SPELL_CREEPING_PLAGUE); + + if (m_pInstance) + m_pInstance->SetData(TYPE_BURU, DONE); } void UpdateAI(const uint32 uiDiff) diff --git a/src/scripts/kalimdor/silithus/ruins_of_ahnqiraj/boss_moam.cpp b/src/scripts/kalimdor/silithus/ruins_of_ahnqiraj/boss_moam.cpp index 589838165..3813b7a55 100644 --- a/src/scripts/kalimdor/silithus/ruins_of_ahnqiraj/boss_moam.cpp +++ b/src/scripts/kalimdor/silithus/ruins_of_ahnqiraj/boss_moam.cpp @@ -22,6 +22,7 @@ SDCategory: Ruins of Ahn'Qiraj EndScriptData */ #include "scriptPCH.h" +#include "ruins_of_ahnqiraj.h" enum { @@ -43,9 +44,12 @@ struct boss_moamAI : public ScriptedAI { boss_moamAI(Creature* pCreature) : ScriptedAI(pCreature) { + m_pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); Reset(); } + ScriptedInstance* m_pInstance; + uint32 m_uiTrample_Timer; uint32 m_uiSummonManaFiend_Timer; uint32 m_uiTurnBackFromStone_Timer; @@ -72,6 +76,9 @@ struct boss_moamAI : public ScriptedAI m_uiArmorValue = m_creature->GetArmor(); m_OGvictim.Clear(); + + if (m_pInstance) + m_pInstance->SetData(TYPE_MOAM, NOT_STARTED); } void Aggro(Unit* pWho) @@ -83,6 +90,9 @@ struct boss_moamAI : public ScriptedAI m_creature->SetPower(POWER_MANA, 0); m_bIsInCombat = true; } + + if (m_pInstance) + m_pInstance->SetData(TYPE_MOAM, IN_PROGRESS); } void JustDied(Unit* pKiller) @@ -93,6 +103,9 @@ struct boss_moamAI : public ScriptedAI m_creature->GetPositionZ(), 0, 0, 0, 0, 0, -1, false); pObsidian->SetRespawnTime(345600); + + if (m_pInstance) + m_pInstance->SetData(TYPE_MOAM, DONE); } /** This function seems to be unused, kept as it is in case of...*/ diff --git a/src/scripts/kalimdor/silithus/ruins_of_ahnqiraj/boss_ossirian.cpp b/src/scripts/kalimdor/silithus/ruins_of_ahnqiraj/boss_ossirian.cpp index 7114be1fe..a13844ad1 100644 --- a/src/scripts/kalimdor/silithus/ruins_of_ahnqiraj/boss_ossirian.cpp +++ b/src/scripts/kalimdor/silithus/ruins_of_ahnqiraj/boss_ossirian.cpp @@ -202,6 +202,8 @@ struct boss_ossirianAI : public ScriptedAI uint32 zoneid = m_creature->GetZoneId(); if (Weather* wth = sWorld.FindWeather(zoneid)) wth->SetWeather(WeatherType(3), 2); + + m_pInstance->SetData(TYPE_OSSIRIAN, IN_PROGRESS); } void JustDied(Unit* pKiller) diff --git a/src/scripts/kalimdor/silithus/ruins_of_ahnqiraj/instance_ruins_of_ahnqiraj.cpp b/src/scripts/kalimdor/silithus/ruins_of_ahnqiraj/instance_ruins_of_ahnqiraj.cpp index 3bdc5268a..e043a3ec1 100644 --- a/src/scripts/kalimdor/silithus/ruins_of_ahnqiraj/instance_ruins_of_ahnqiraj.cpp +++ b/src/scripts/kalimdor/silithus/ruins_of_ahnqiraj/instance_ruins_of_ahnqiraj.cpp @@ -75,7 +75,7 @@ void instance_ruins_of_ahnqiraj::Initialize() bool instance_ruins_of_ahnqiraj::IsEncounterInProgress() const { for (uint8 i = 0; i < INSTANCE_RUINS_AQ_MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) + if (m_auiEncounter[i] == IN_PROGRESS || m_auiEncounter[i] == SPECIAL) return true; return false; } @@ -376,6 +376,10 @@ uint32 instance_ruins_of_ahnqiraj::GetData(uint32 uiType) case TYPE_KURINNAXX: case TYPE_GENERAL_ANDOROV: case TYPE_RAJAXX: + case TYPE_BURU: + case TYPE_MOAM: + case TYPE_AYAMISS: + case TYPE_OSSIRIAN: return m_auiEncounter[uiType]; case TYPE_WAVE1: case TYPE_WAVE2: @@ -468,6 +472,13 @@ void instance_ruins_of_ahnqiraj::SetData(uint32 uiType, uint32 uiData) crystalIndexes.clear(); crystalIndexHistory.clear(); } + m_auiEncounter[TYPE_OSSIRIAN] = uiData; + break; + case TYPE_BURU: + case TYPE_MOAM: + case TYPE_AYAMISS: + m_auiEncounter[uiType] = uiData; + break; default: return; } @@ -478,7 +489,8 @@ void instance_ruins_of_ahnqiraj::SetData(uint32 uiType, uint32 uiData) OUT_SAVE_INST_DATA; std::ostringstream saveStream; - saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " "; + saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " " + << m_auiEncounter[3] << " " << m_auiEncounter[4] << " " << m_auiEncounter[5] << " " << m_auiEncounter[6]; strInstData = saveStream.str(); @@ -504,7 +516,8 @@ void instance_ruins_of_ahnqiraj::Load(const char* chrIn) std::istringstream loadStream(chrIn); - loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2]; + loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3] + >> m_auiEncounter[4] >> m_auiEncounter[5] >> m_auiEncounter[6]; for (uint8 i = 0; i < INSTANCE_RUINS_AQ_MAX_ENCOUNTER; ++i) if (m_auiEncounter[i] == IN_PROGRESS || m_auiEncounter[i] > SPECIAL) // Do not load an encounter as "In Progress" - reset it instead. diff --git a/src/scripts/kalimdor/silithus/ruins_of_ahnqiraj/ruins_of_ahnqiraj.h b/src/scripts/kalimdor/silithus/ruins_of_ahnqiraj/ruins_of_ahnqiraj.h index 9a83edada..2dae40951 100644 --- a/src/scripts/kalimdor/silithus/ruins_of_ahnqiraj/ruins_of_ahnqiraj.h +++ b/src/scripts/kalimdor/silithus/ruins_of_ahnqiraj/ruins_of_ahnqiraj.h @@ -20,12 +20,12 @@ enum TYPE_KURINNAXX = 0, TYPE_GENERAL_ANDOROV = 1, TYPE_RAJAXX = 2, - INSTANCE_RUINS_AQ_MAX_ENCOUNTER = 3, + TYPE_BURU = 3, + TYPE_MOAM = 4, + TYPE_AYAMISS = 5, + TYPE_OSSIRIAN = 6, + INSTANCE_RUINS_AQ_MAX_ENCOUNTER = 7, - TYPE_BURU = 4, - TYPE_MOAM = 5, - TYPE_AYAMISS = 6, - TYPE_OSSIRIAN = 7, TYPE_QIRAJI_GLADIATOR = 8, }; diff --git a/src/scripts/kalimdor/silithus/temple_of_ahnqiraj/boss_bug_trio.cpp b/src/scripts/kalimdor/silithus/temple_of_ahnqiraj/boss_bug_trio.cpp index 1cf96e83d..a92bc3587 100644 --- a/src/scripts/kalimdor/silithus/temple_of_ahnqiraj/boss_bug_trio.cpp +++ b/src/scripts/kalimdor/silithus/temple_of_ahnqiraj/boss_bug_trio.cpp @@ -56,6 +56,12 @@ struct boss_bug_trioAI : public ScriptedAI m_uiEvadeCheckTimer = 2500; } + void JustReachedHome() override + { + if (m_pInstance) + m_pInstance->SetData(TYPE_BUG_TRIO, FAIL); + } + void EnterEvadeMode() override { // If somehow a raid wipes during devour phase, restore normal speed/behavior @@ -67,7 +73,7 @@ struct boss_bug_trioAI : public ScriptedAI { // Reset the slain bug count on pull if (m_pInstance) - m_pInstance->SetData(TYPE_BUG_TRIO, FAIL); + m_pInstance->SetData(TYPE_BUG_TRIO, IN_PROGRESS); } void MoveInLineOfSight(Unit* pWho) override diff --git a/src/scripts/kalimdor/silithus/temple_of_ahnqiraj/boss_huhuran.cpp b/src/scripts/kalimdor/silithus/temple_of_ahnqiraj/boss_huhuran.cpp index 6111c6f73..29294eaba 100644 --- a/src/scripts/kalimdor/silithus/temple_of_ahnqiraj/boss_huhuran.cpp +++ b/src/scripts/kalimdor/silithus/temple_of_ahnqiraj/boss_huhuran.cpp @@ -70,6 +70,18 @@ struct boss_huhuranAI : public ScriptedAI ScriptedAI::MoveInLineOfSight(pWho); } + void Aggro(Unit* /*pWho*/) override + { + if (m_pInstance) + m_pInstance->SetData(TYPE_HUHURAN, IN_PROGRESS); + } + + void JustReachedHome() override + { + if (m_pInstance) + m_pInstance->SetData(TYPE_HUHURAN, FAIL); + } + void JustDied(Unit*) override { if (m_pInstance) diff --git a/src/scripts/kalimdor/silithus/temple_of_ahnqiraj/instance_temple_of_ahnqiraj.cpp b/src/scripts/kalimdor/silithus/temple_of_ahnqiraj/instance_temple_of_ahnqiraj.cpp index 071e7660e..4df2b3b38 100644 --- a/src/scripts/kalimdor/silithus/temple_of_ahnqiraj/instance_temple_of_ahnqiraj.cpp +++ b/src/scripts/kalimdor/silithus/temple_of_ahnqiraj/instance_temple_of_ahnqiraj.cpp @@ -163,7 +163,7 @@ bool instance_temple_of_ahnqiraj::IsEncounterInProgress() const { for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) { - if (m_auiEncounter[i] == IN_PROGRESS) + if (m_auiEncounter[i] == IN_PROGRESS || m_auiEncounter[i] == SPECIAL) return true; } @@ -332,12 +332,12 @@ void instance_temple_of_ahnqiraj::SetData(uint32 uiType, uint32 uiData) if (uiData == SPECIAL) { ++m_uiBugTrioDeathCount; - if (m_uiBugTrioDeathCount == 2) + if (m_uiBugTrioDeathCount >= 3) SetData(TYPE_BUG_TRIO, DONE); // don't store any special data break; } - if (uiData == FAIL) + if (uiData == IN_PROGRESS) m_uiBugTrioDeathCount = 0; m_auiEncounter[uiType] = uiData; break;