diff options
14 files changed, 222 insertions, 59 deletions
diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp index bb21252efb0..ddf000e31c7 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp @@ -545,7 +545,15 @@ void BossAI::_EnterCombat() me->setActive(true); DoZoneInCombat(); if (instance) + { + // bosses do not respawn, check only on enter combat + if (!instance->CheckRequiredBosses(bossId)) + { + EnterEvadeMode(); + return; + } instance->SetBossState(bossId, IN_PROGRESS); + } } void BossAI::TeleportCheaters() diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp index 42a9c1eb291..29cf2043662 100755 --- a/src/server/game/Instances/InstanceScript.cpp +++ b/src/server/game/Instances/InstanceScript.cpp @@ -379,6 +379,17 @@ void InstanceScript::DoRemoveAurasDueToSpellOnPlayers(uint32 spell) pPlayer->RemoveAurasDueToSpell(spell); } +// Cast spell on all players in instance +void InstanceScript::DoCastSpellOnPlayers(uint32 spell) +{ + Map::PlayerList const &PlayerList = instance->GetPlayers(); + + if (!PlayerList.isEmpty()) + for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) + if (Player* player = i->getSource()) + player->CastSpell(player, spell, true); +} + bool InstanceScript::CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* /*source*/, Unit const* /*target*/ /*= NULL*/, uint32 /*miscvalue1*/ /*= 0*/) { sLog->outError("Achievement system call InstanceScript::CheckAchievementCriteriaMeet but instance script for map %u not have implementation for achievement criteria %u", diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h index 26a06af3ecd..675adc9304b 100755 --- a/src/server/game/Instances/InstanceScript.h +++ b/src/server/game/Instances/InstanceScript.h @@ -173,6 +173,9 @@ class InstanceScript : public ZoneScript // Remove Auras due to Spell on all players in instance void DoRemoveAurasDueToSpellOnPlayers(uint32 spell); + // Cast spell on all players in instance + void DoCastSpellOnPlayers(uint32 spell); + // Return wether server allow two side groups or not bool ServerAllowsTwoSideGroups() { return sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP); } @@ -183,6 +186,10 @@ class InstanceScript : public ZoneScript // Achievement criteria additional requirements check // NOTE: not use this if same can be checked existed requirement types from AchievementCriteriaRequirementType virtual bool CheckAchievementCriteriaMeet(uint32 /*criteria_id*/, Player const* /*source*/, Unit const* /*target*/ = NULL, uint32 /*miscvalue1*/ = 0); + + // Checks boss requirements (one boss required to kill other) + virtual bool CheckRequiredBosses(uint32 /*bossId*/, Player const* /*player*/ = NULL) const { return true; } + protected: void SetBossNumber(uint32 number) { bosses.resize(number); } void LoadDoorData(const DoorData *data); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp index 0791b1b3f3a..3c45bc1e7a9 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp @@ -22,7 +22,7 @@ #include "SpellAuraEffects.h" #include "icecrown_citadel.h" -enum eTexts +enum Texts { // Blood Queen Lana'Thel SAY_INTRO_1 = 0, @@ -55,7 +55,7 @@ enum eTexts SAY_VALANAR_DEATH = 6, }; -enum eSpells +enum Spells { SPELL_FEIGN_DEATH = 71598, SPELL_OOC_INVOCATION_VISUAL = 70934, @@ -110,7 +110,7 @@ enum eSpells SPELL_SHOCK_VORTEX_DUMMY = 72633, }; -enum eEvents +enum Events { EVENT_INTRO_1 = 1, EVENT_INTRO_2 = 2, @@ -133,7 +133,7 @@ enum eEvents EVENT_CONTINUE_FALLING = 12, }; -enum eActions +enum Actions { ACTION_STAND_UP = 1, ACTION_CAST_INVOCATION = 2, @@ -142,13 +142,13 @@ enum eActions ACTION_FLAME_BALL_CHASE = 5, }; -enum ePoints +enum Points { POINT_INTRO_DESPAWN = 380040, POINT_KINETIC_BOMB_IMPACT = 384540, }; -enum eDisplays +enum Displays { DISPLAY_KINETIC_BOMB = 31095, }; @@ -199,8 +199,15 @@ class boss_blood_council_controller : public CreatureScript instance->SetBossState(DATA_BLOOD_PRINCE_COUNCIL, NOT_STARTED); } - void EnterCombat(Unit* /*who*/) + void EnterCombat(Unit* who) { + if (!instance->CheckRequiredBosses(DATA_BLOOD_PRINCE_COUNCIL, who->ToPlayer())) + { + instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT); + EnterEvadeMode(); + return; + } + instance->SetBossState(DATA_BLOOD_PRINCE_COUNCIL, IN_PROGRESS); DoCast(me, SPELL_INVOCATION_OF_BLOOD_VALANAR); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp index e602d6b952e..8d3eace123c 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp @@ -23,7 +23,7 @@ #include "SpellAuraEffects.h" #include "icecrown_citadel.h" -enum eTexts +enum Texts { SAY_AGGRO = 0, SAY_VAMPIRIC_BITE = 1, @@ -39,7 +39,7 @@ enum eTexts SAY_DEATH = 11, }; -enum eSpells +enum Spells { SPELL_SHROUD_OF_SORROW = 70986, SPELL_FRENZIED_BLOODTHIRST_VISUAL = 71949, @@ -61,7 +61,7 @@ enum eSpells SPELL_BLOODBOLT_WHIRL = 71772, }; -enum eShadowmourne +enum Shadowmourne { QUEST_BLOOD_INFUSION = 24756, ITEM_SHADOW_S_EDGE = 49888, @@ -155,8 +155,15 @@ class boss_blood_queen_lana_thel : public CreatureScript instance->SetBossState(DATA_BLOOD_QUEEN_LANA_THEL, NOT_STARTED); } - void EnterCombat(Unit* /*who*/) + void EnterCombat(Unit* who) { + if (!instance->CheckRequiredBosses(DATA_BLOOD_QUEEN_LANA_THEL, who->ToPlayer())) + { + instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT); + EnterEvadeMode(); + return; + } + DoZoneInCombat(); Talk(SAY_AGGRO); instance->SetBossState(DATA_BLOOD_QUEEN_LANA_THEL, IN_PROGRESS); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index 6e3d4b4e877..5ed62438429 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -23,7 +23,7 @@ #include "SpellAuras.h" #include "icecrown_citadel.h" -enum eScriptTexts +enum ScriptTexts { // Deathbringer Saurfang SAY_INTRO_ALLIANCE_2 = 0, @@ -84,7 +84,7 @@ enum eScriptTexts SAY_OUTRO_ALLIANCE_20 = 3, }; -enum eSpells +enum Spells { // Deathbringer Saurfang SPELL_ZERO_POWER = 72242, @@ -117,7 +117,7 @@ enum eSpells // Helper to get id of the aura on different modes (HasAura(baseId) wont work) #define BOILING_BLOOD_HELPER RAID_MODE<int32>(72385,72441,72442,72443) -enum eEvents +enum Events { EVENT_INTRO_ALLIANCE_1 = 1, EVENT_INTRO_ALLIANCE_2 = 2, @@ -177,7 +177,7 @@ enum eEvents EVENT_OUTRO_HORDE_8 = 51, }; -enum ePhases +enum Phases { PHASE_INTRO_A = 1, PHASE_INTRO_H = 2, @@ -186,7 +186,7 @@ enum ePhases PHASE_INTRO_MASK = (1 << PHASE_INTRO_A) | (1 << PHASE_INTRO_H), }; -enum eActions +enum Actions { ACTION_START_EVENT = -3781300, ACTION_CONTINUE_INTRO = -3781301, @@ -198,7 +198,7 @@ enum eActions #define DATA_MADE_A_MESS 45374613 // 4537, 4613 are achievement IDs -enum eMovePoints +enum MovePoints { POINT_SAURFANG = 3781300, POINT_FIRST_STEP = 3781301, @@ -273,8 +273,15 @@ class boss_deathbringer_saurfang : public CreatureScript instance->SetBossState(DATA_DEATHBRINGER_SAURFANG, NOT_STARTED); } - void EnterCombat(Unit* /*who*/) + void EnterCombat(Unit* who) { + if (!instance->CheckRequiredBosses(DATA_DEATHBRINGER_SAURFANG, who->ToPlayer())) + { + instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT); + EnterEvadeMode(); + return; + } + // oh just screw intro, enter combat - no exploits please events.SetPhase(PHASE_COMBAT); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp index 6a03c5e0350..a5f9c748bb5 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp @@ -22,7 +22,7 @@ #include "SpellAuras.h" #include "icecrown_citadel.h" -enum eScriptTexts +enum ScriptTexts { SAY_STINKY_DEAD = 0, SAY_AGGRO = 1, @@ -36,7 +36,7 @@ enum eScriptTexts SAY_DEATH = 9, }; -enum eSpells +enum Spells { // Festergut SPELL_INHALE_BLIGHT = 69165, @@ -60,7 +60,7 @@ enum eSpells static const uint32 gaseousBlight[3] = {69157, 69162, 69164}; static const uint32 gaseousBlightVisual[3] = {69126, 69152, 69154}; -enum eEvents +enum Events { EVENT_BERSERK = 1, EVENT_INHALE_BLIGHT = 2, @@ -119,8 +119,15 @@ class boss_festergut : public CreatureScript instance->SetBossState(DATA_FESTERGUT, NOT_STARTED); } - void EnterCombat(Unit* /*who*/) + void EnterCombat(Unit* who) { + if (!instance->CheckRequiredBosses(DATA_FESTERGUT, who->ToPlayer())) + { + instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT); + EnterEvadeMode(); + return; + } + Talk(SAY_AGGRO); if (Creature* gasDummy = me->FindNearestCreature(NPC_GAS_DUMMY, 100.0f, true)) gasDummyGUID = gasDummy->GetGUID(); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp index 99d10b22d21..1e1ce88c1a2 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp @@ -22,7 +22,7 @@ #include "icecrown_citadel.h" #include "Group.h" -enum eScriptTexts +enum ScriptTexts { SAY_INTRO_1 = 0, SAY_INTRO_2 = 1, @@ -43,7 +43,7 @@ enum eScriptTexts SAY_DEATH = 16, }; -enum eSpells +enum Spells { // Lady Deathwhisper SPELL_MANA_BARRIER = 70842, @@ -91,7 +91,7 @@ enum eSpells SPELL_VENGEFUL_BLAST_25H = 72012, }; -enum eEvents +enum Events { // Lady Deathwhisper EVENT_INTRO_2 = 1, @@ -133,7 +133,7 @@ enum eEvents EVENT_ADHERENT_SHORUD_OF_THE_OCCULT = 27, }; -enum ePhases +enum Phases { PHASE_ALL = 0, PHASE_INTRO = 1, @@ -223,6 +223,13 @@ class boss_lady_deathwhisper : public CreatureScript void EnterCombat(Unit* who) { + if (!instance->CheckRequiredBosses(DATA_LADY_DEATHWHISPER, who->ToPlayer())) + { + instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT); + EnterEvadeMode(); + return; + } + events.Reset(); events.SetPhase(PHASE_ONE); // phase-independent events diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp index dc583ea6ed2..6cf12245382 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp @@ -23,7 +23,7 @@ #include "icecrown_citadel.h" #include "MapManager.h" -enum eScriptTexts +enum ScriptTexts { SAY_ENTER_ZONE = 0, SAY_AGGRO = 1, @@ -35,7 +35,7 @@ enum eScriptTexts EMOTE_BONE_STORM = 7, }; -enum eSpells +enum Spells { // Lord Marrowgar SPELL_BONE_SLICE = 69055, @@ -54,7 +54,7 @@ enum eSpells static const uint32 boneSpikeSummonId[3] = {69062, 72669, 72670}; -enum eEvents +enum Events { EVENT_BONE_SPIKE_GRAVEYARD = 1, EVENT_COLDFLAME = 2, @@ -71,7 +71,7 @@ enum eEvents EVENT_GROUP_SPECIAL = 1, }; -enum eMovementPoints +enum MovementPoints { POINT_TARGET_BONESTORM_PLAYER = 36612631, POINT_TARGET_COLDFLAME = 36672631, diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp index c77d164f23e..d5a3647fc05 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp @@ -22,7 +22,7 @@ #include "SpellAuraEffects.h" #include "icecrown_citadel.h" -enum eScriptTexts +enum ScriptTexts { // Festergut SAY_FESTERGUT_GASEOUS_BLIGHT = 0, @@ -45,7 +45,7 @@ enum eScriptTexts SAY_DEATH = 13, }; -enum eSpells +enum Spells { // Festergut SPELL_RELEASE_GAS_VISUAL = 69125, @@ -102,7 +102,7 @@ enum eSpells #define SPELL_GASEOUS_BLOAT_HELPER RAID_MODE<uint32>(70672,72455,72832,72833) -enum eEvents +enum Events { // Festergut EVENT_FESTERGUT_DIES = 1, @@ -126,7 +126,7 @@ enum eEvents EVENT_PHASE_TRANSITION = 15, }; -enum ePhases +enum Phases { PHASE_NONE = 0, PHASE_FESTERGUT = 1, @@ -139,7 +139,7 @@ enum ePhases PHASE_MASK_NOT_SELF = (1 << PHASE_FESTERGUT) | (1 << PHASE_ROTFACE), }; -enum ePoints +enum Points { POINT_FESTERGUT = 366260, POINT_ROTFACE = 366270, @@ -209,11 +209,18 @@ class boss_professor_putricide : public CreatureScript table->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); } - void EnterCombat(Unit* /*who*/) + void EnterCombat(Unit* who) { if (events.GetPhaseMask() & PHASE_MASK_NOT_SELF) return; + if (!instance->CheckRequiredBosses(DATA_PROFESSOR_PUTRICIDE, who->ToPlayer())) + { + instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT); + EnterEvadeMode(); + return; + } + _SetPhase(PHASE_COMBAT_1); Talk(SAY_AGGRO); DoCast(me, SPELL_OOZE_TANK_PROTECTION, true); @@ -652,14 +659,14 @@ class boss_professor_putricide : public CreatureScript } private: - void _SetPhase(ePhases newPhase) + void _SetPhase(Phases newPhase) { phase = newPhase; events.SetPhase(newPhase); } uint64 oozeFloodDummy[4]; - ePhases phase; // external of EventMap because event phase gets reset on evade + Phases phase; // external of EventMap because event phase gets reset on evade const float baseSpeed; uint8 oozeFloodStage; bool experimentState; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp index edf7381c4d5..5498d715088 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp @@ -25,7 +25,7 @@ // KNOWN BUGS: // ~ No Slime Spray animation directly at target spot -enum eTexts +enum Texts { SAY_PRECIOUS_DIES = 0, SAY_AGGRO = 1, @@ -38,7 +38,7 @@ enum eTexts SAY_DEATH = 8, }; -enum eSpells +enum Spells { // Rotface SPELL_SLIME_SPRAY = 69508, // every 20 seconds @@ -64,7 +64,7 @@ enum eSpells #define MUTATED_INFECTION RAID_MODE<int32>(69674,71224,73022,73023) -enum eEvents +enum Events { EVENT_SLIME_SPRAY = 1, EVENT_HASTEN_INFECTIONS = 2, @@ -111,8 +111,15 @@ class boss_rotface : public CreatureScript instance->SetBossState(DATA_ROTFACE, NOT_STARTED); } - void EnterCombat(Unit* /*who*/) + void EnterCombat(Unit* who) { + if (!instance->CheckRequiredBosses(DATA_ROTFACE, who->ToPlayer())) + { + instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT); + EnterEvadeMode(); + return; + } + Talk(SAY_AGGRO); if (Creature* professor = Unit::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) professor->AI()->DoAction(ACTION_ROTFACE_COMBAT); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h index 9607e0d5454..6eac43f391e 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h @@ -21,13 +21,24 @@ #define ICCScriptName "instance_icecrown_citadel" // Shared spells used by every boss -enum eSharedSpells +enum SharedSpells { SPELL_BERSERK = 26662, SPELL_BERSERK2 = 47008 }; -enum eData +enum TeleporterSpells +{ + LIGHT_S_HAMMER_TELEPORT = 70781, + ORATORY_OF_THE_DAMNED_TELEPORT = 70856, + RAMPART_OF_SKULLS_TELEPORT = 70857, + DEATHBRINGER_S_RISE_TELEPORT = 70858, + UPPER_SPIRE_TELEPORT = 70859, + FROZEN_THRONE_TELEPORT = 70860, + SINDRAGOSA_S_LAIR_TELEPORT = 70861 +}; + +enum DataTypes { // Encounter States/Boss GUIDs DATA_LORD_MARROWGAR = 0, @@ -58,7 +69,7 @@ enum eData #define MAX_ENCOUNTER 12 -enum eCreatures +enum CreaturesIds { // At Light's Hammer NPC_KOR_KRON_GENERAL = 37189, @@ -141,7 +152,7 @@ enum eCreatures NPC_BLOOD_QUEEN_LANA_THEL = 37955, }; -enum eGameobjects +enum GameObjectsIds { // Lord Marrogar GO_DOODAD_ICECROWN_ICEWALL02 = 201910, @@ -190,7 +201,7 @@ enum eGameobjects GO_SINDRAGOSA_SHORTCUT_EXIT_DOOR = 201379, }; -enum eAchievementCriteria +enum AchievementCriteriaIds { // Lord Marrowgar CRITERIA_BONED_10N = 12775, @@ -225,7 +236,7 @@ enum eAchievementCriteria CRITERIA_ONCE_BITTEN_TWICE_SHY_25V = 13013, }; -enum eSharedActions +enum SharedActions { // Festergut ACTION_FESTERGUT_COMBAT = -366260, diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp index 148bce0e613..7875f3a3c1a 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp @@ -21,17 +21,6 @@ #include "icecrown_citadel.h" #include "Spell.h" -enum eSpellAction -{ - LIGHT_S_HAMMER_TELEPORT = 70781, - ORATORY_OF_THE_DAMNED_TELEPORT = 70856, - RAMPART_OF_SKULLS_TELEPORT = 70857, - DEATHBRINGER_S_RISE_TELEPORT = 70858, - UPPER_SPIRE_TELEPORT = 70859, - FROZEN_THRONE_TELEPORT = 70860, - SINDRAGOSA_S_LAIR_TELEPORT = 70861 -}; - #define GOSSIP_SENDER_ICC_PORT 631 class icecrown_citadel_teleport : public GameObjectScript diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp index f79ca9270b6..b121125b5d9 100755 --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp @@ -458,6 +458,94 @@ class instance_icecrown_citadel : public InstanceMapScript return false; } + bool CheckRequiredBosses(uint32 bossId, Player const* player = NULL) const + { + if (player && player->isGameMaster()) + return true; + + switch (bossId) + { + case DATA_THE_LICH_KING: + if (!CheckPlagueworks(bossId)) + return false; + if (!CheckCrimsonHalls(bossId)) + return false; + if (!CheckFrostwingHalls(bossId)) + return false; + break; + case DATA_SINDRAGOSA: + case DATA_VALITHRIA_DREAMWALKER: + if (!CheckFrostwingHalls(bossId)) + return false; + break; + case DATA_BLOOD_QUEEN_LANA_THEL: + case DATA_BLOOD_PRINCE_COUNCIL: + if (!CheckCrimsonHalls(bossId)) + return false; + break; + case DATA_FESTERGUT: + case DATA_ROTFACE: + case DATA_PROFESSOR_PUTRICIDE: + if (!CheckPlagueworks(bossId)) + return false; + break; + default: + break; + } + + if (!CheckLowerSpire(bossId)) + return false; + + return true; + } + + bool CheckPlagueworks(uint32 bossId) const + { + if (bossId == DATA_PROFESSOR_PUTRICIDE) + if (GetBossState(DATA_FESTERGUT) != DONE || GetBossState(DATA_ROTFACE) != DONE) + return false; + + return true; + } + + bool CheckCrimsonHalls(uint32 bossId) const + { + if (bossId == DATA_BLOOD_QUEEN_LANA_THEL) + if (GetBossState(DATA_BLOOD_PRINCE_COUNCIL) != DONE) + return false; + + return true; + } + + bool CheckFrostwingHalls(uint32 bossId) const + { + if (bossId == DATA_SINDRAGOSA) + if (GetBossState(DATA_VALITHRIA_DREAMWALKER) != DONE) + return false; + + return true; + } + + bool CheckLowerSpire(uint32 bossId) const + { + switch (bossId) + { + case DATA_DEATHBRINGER_SAURFANG: + if (GetBossState(DATA_GUNSHIP_EVENT) != DONE) + return false; + case DATA_GUNSHIP_EVENT: + if (GetBossState(DATA_LADY_DEATHWHISPER) != DONE) + return false; + case DATA_LADY_DEATHWHISPER: + if (GetBossState(DATA_LORD_MARROWGAR) != DONE) + return false; + default: + break; + } + + return true; + } + std::string GetSaveData() { OUT_SAVE_INST_DATA; |