diff options
Diffstat (limited to 'src')
6 files changed, 111 insertions, 220 deletions
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index 0ec72b2ee25..bb4645615ce 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -230,12 +230,12 @@ class boss_deathbringer_saurfang : public CreatureScript public: boss_deathbringer_saurfang() : CreatureScript("boss_deathbringer_saurfang") { } - struct boss_deathbringer_saurfangAI : public ScriptedAI + struct boss_deathbringer_saurfangAI : public BossAI { - boss_deathbringer_saurfangAI(Creature* pCreature) : ScriptedAI(pCreature), summons(pCreature) + boss_deathbringer_saurfangAI(Creature* pCreature) : BossAI(pCreature, DATA_DEATHBRINGER_SAURFANG) { + ASSERT(instance); ASSERT(pCreature->GetVehicleKit()); // we dont actually use it, just check if exists - pInstance = pCreature->GetInstanceScript(); bIntroDone = false; uiFallenChampionCount = 0; } @@ -253,10 +253,8 @@ class boss_deathbringer_saurfang : public CreatureScript me->RemoveAurasDueToSpell(SPELL_BERSERK); me->RemoveAurasDueToSpell(SPELL_FRENZY); me->RemoveAurasDueToSpell(SPELL_BLOOD_POWER); - uiFallenChampionCount = 0; summons.DespawnAll(); - if (pInstance) - pInstance->SetData(DATA_DEATHBRINGER_SAURFANG, NOT_STARTED); + instance->SetBossState(DATA_DEATHBRINGER_SAURFANG, NOT_STARTED); } void EnterCombat(Unit* /*who*/) @@ -268,8 +266,8 @@ class boss_deathbringer_saurfang : public CreatureScript events.ScheduleEvent(EVENT_BLOOD_NOVA, 17000, 0, PHASE_COMBAT); events.ScheduleEvent(EVENT_RUNE_OF_BLOOD, 20000, 0, PHASE_COMBAT); - if (pInstance) - pInstance->SetData(DATA_DEATHBRINGER_SAURFANG, IN_PROGRESS); + uiFallenChampionCount = 0; + instance->SetBossState(DATA_DEATHBRINGER_SAURFANG, IN_PROGRESS); } void JustDied(Unit* /*killer*/) @@ -277,12 +275,10 @@ class boss_deathbringer_saurfang : public CreatureScript DoCastAOE(SPELL_ACHIEVEMENT, true); DoScriptText(SAY_DEATH, me); - if (pInstance) - { - pInstance->SetData(DATA_DEATHBRINGER_SAURFANG, DONE); - if (Creature* creature = ObjectAccessor::GetCreature(*me, pInstance->GetData64(DATA_SAURFANG_EVENT_NPC))) - creature->AI()->DoAction(ACTION_START_OUTRO); - } + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_MARK_OF_THE_FALLEN_CHAMPION); + instance->SetBossState(DATA_DEATHBRINGER_SAURFANG, DONE); + if (Creature* creature = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SAURFANG_EVENT_NPC))) + creature->AI()->DoAction(ACTION_START_OUTRO); } void MoveInLineOfSight(Unit* /*who*/) @@ -307,8 +303,7 @@ class boss_deathbringer_saurfang : public CreatureScript void JustReachedHome() { - if(pInstance) - pInstance->SetData(DATA_DEATHBRINGER_SAURFANG, FAIL); + instance->SetBossState(DATA_DEATHBRINGER_SAURFANG, FAIL); } void KilledUnit(Unit *victim) @@ -350,8 +345,7 @@ class boss_deathbringer_saurfang : public CreatureScript if (type != POINT_MOTION_TYPE && id != POINT_SAURFANG) return; - if (pInstance) - pInstance->HandleGameObject(pInstance->GetData64(DATA_SAURFANG_DOOR), false); + instance->HandleGameObject(instance->GetData64(GO_SAURFANG_S_DOOR), false); } void SpellHitTarget(Unit* target, const SpellEntry* spell) @@ -468,6 +462,12 @@ class boss_deathbringer_saurfang : public CreatureScript { if (action == PHASE_INTRO_A || action == PHASE_INTRO_H) { + if (GameObject* teleporter = GameObject::GetGameObject(*me, instance->GetData64(GO_SCOURGE_TRANSPORTER_SAURFANG))) + { + instance->HandleGameObject(0, false, teleporter); + teleporter->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); + } + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); // controls what events will execute events.SetPhase(uint32(action)); @@ -504,9 +504,6 @@ class boss_deathbringer_saurfang : public CreatureScript } private: - EventMap events; - InstanceScript* pInstance; - SummonList summons; bool bIntroDone; bool bFrenzy; // faster than iterating all auras to find Frenzy uint32 uiFallenChampionCount; @@ -553,7 +550,7 @@ class npc_high_overlord_saurfang_icc : public CreatureScript if (pInstance) { uiDeathbringerSaurfangGUID = pInstance->GetData64(DATA_DEATHBRINGER_SAURFANG); - pInstance->HandleGameObject(pInstance->GetData64(DATA_SAURFANG_DOOR), true); + pInstance->HandleGameObject(pInstance->GetData64(GO_SAURFANG_S_DOOR), true); } if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, uiDeathbringerSaurfangGUID)) deathbringer->AI()->DoAction(PHASE_INTRO_H); @@ -689,7 +686,7 @@ class npc_high_overlord_saurfang_icc : public CreatureScript return false; InstanceScript* pInstance = pCreature->GetInstanceScript(); - if (pInstance && pInstance->GetData(DATA_DEATHBRINGER_SAURFANG) != DONE) + if (pInstance && pInstance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE) { pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Let it begin...", 631, -ACTION_START_EVENT); pPlayer->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, pCreature->GetGUID()); @@ -746,7 +743,7 @@ class npc_muradin_bronzebeard_icc : public CreatureScript if (pInstance) { uiDeathbringerSaurfangGUID = pInstance->GetData64(DATA_DEATHBRINGER_SAURFANG); - pInstance->HandleGameObject(pInstance->GetData64(DATA_SAURFANG_DOOR), true); + pInstance->HandleGameObject(pInstance->GetData64(GO_SAURFANG_S_DOOR), true); } if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, uiDeathbringerSaurfangGUID)) deathbringer->AI()->DoAction(PHASE_INTRO_A); @@ -819,7 +816,7 @@ class npc_muradin_bronzebeard_icc : public CreatureScript return false; InstanceScript* pInstance = pCreature->GetInstanceScript(); - if (pInstance && pInstance->GetData(DATA_DEATHBRINGER_SAURFANG) != DONE) + if (pInstance && pInstance->GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE) { pPlayer->ADD_GOSSIP_ITEM(0, "Let it begin...", 631, -ACTION_START_EVENT+1); pPlayer->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, pCreature->GetGUID()); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp index 4f88125c3a6..551967b5743 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp @@ -157,11 +157,11 @@ class boss_lady_deathwhisper : public CreatureScript public: boss_lady_deathwhisper() : CreatureScript("boss_lady_deathwhisper") { } - struct boss_lady_deathwhisperAI : public ScriptedAI + struct boss_lady_deathwhisperAI : public BossAI { - boss_lady_deathwhisperAI(Creature* pCreature) : ScriptedAI(pCreature), summons(me) + boss_lady_deathwhisperAI(Creature* pCreature) : BossAI(pCreature, DATA_LADY_DEATHWHISPER) { - pInstance = pCreature->GetInstanceScript(); + ASSERT(instance); bIntroDone = false; uiDominateMindCount = RAID_MODE(0,1,1,3); } @@ -179,8 +179,7 @@ class boss_lady_deathwhisper : public CreatureScript me->RemoveAurasDueToSpell(SPELL_MANA_BARRIER); me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false); me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false); - if (pInstance) - pInstance->SetData(DATA_LADY_DEATHWHISPER, NOT_STARTED); + instance->SetBossState(DATA_LADY_DEATHWHISPER, NOT_STARTED); } void MoveInLineOfSight(Unit* who) @@ -229,16 +228,14 @@ class boss_lady_deathwhisper : public CreatureScript me->RemoveAurasDueToSpell(SPELL_SHADOW_CHANNELING); DoCast(me, SPELL_MANA_BARRIER, true); - if (pInstance) - pInstance->SetData(DATA_LADY_DEATHWHISPER, IN_PROGRESS); + instance->SetBossState(DATA_LADY_DEATHWHISPER, IN_PROGRESS); } void JustDied(Unit* killer) { DoScriptText(SAY_DEATH, me); - if (pInstance) - pInstance->SetData(DATA_LADY_DEATHWHISPER, DONE); + instance->SetBossState(DATA_LADY_DEATHWHISPER, DONE); std::set<uint32> livingAddEntries; // Full House achievement @@ -273,8 +270,7 @@ class boss_lady_deathwhisper : public CreatureScript void JustReachedHome() { - if(pInstance) - pInstance->SetData(DATA_LADY_DEATHWHISPER, FAIL); + instance->SetBossState(DATA_LADY_DEATHWHISPER, FAIL); summons.DespawnAll(); } @@ -337,7 +333,7 @@ class boss_lady_deathwhisper : public CreatureScript void UpdateAI(const uint32 diff) { - if (!UpdateVictim() && !(events.GetPhaseMask() & PHASE_INTRO_MASK)) + if ((!UpdateVictim() && !(events.GetPhaseMask() & PHASE_INTRO_MASK)) || !CheckInRoom()) return; events.Update(diff); @@ -538,12 +534,9 @@ class boss_lady_deathwhisper : public CreatureScript } private: - EventMap events; - InstanceScript* pInstance; bool bIntroDone; uint32 uiAddWaveCounter; uint64 uiNextVengefulShadeTarget; - SummonList summons; std::deque<uint64> reanimationQueue; uint8 uiDominateMindCount; }; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp index 914cde7a68a..d9e90da9b40 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp @@ -78,14 +78,14 @@ class boss_lord_marrowgar : public CreatureScript public: boss_lord_marrowgar() : CreatureScript("boss_lord_marrowgar") { } - struct boss_lord_marrowgarAI : public ScriptedAI + struct boss_lord_marrowgarAI : public BossAI { - boss_lord_marrowgarAI(Creature *pCreature) : ScriptedAI(pCreature) + boss_lord_marrowgarAI(Creature *pCreature) : BossAI(pCreature, DATA_LORD_MARROWGAR) { + ASSERT(instance); uiBoneStormDuration = RAID_MODE(20000,30000,20000,30000); fBaseSpeed = pCreature->GetSpeedRate(MOVE_RUN); bIntroDone = false; - pInstance = pCreature->GetInstanceScript(); coldflameLastPos.Relocate(pCreature); } @@ -100,30 +100,26 @@ class boss_lord_marrowgar : public CreatureScript events.ScheduleEvent(EVENT_COLDFLAME, urand(10000, 15000)); events.ScheduleEvent(EVENT_WARN_BONE_STORM, urand(35000, 50000)); events.ScheduleEvent(EVENT_ENRAGE, 600000); - if (pInstance) - pInstance->SetData(DATA_LORD_MARROWGAR, NOT_STARTED); + instance->SetBossState(DATA_LORD_MARROWGAR, NOT_STARTED); } void EnterCombat(Unit* /*who*/) { DoScriptText(SAY_AGGRO, me); - if (pInstance) - pInstance->SetData(DATA_LORD_MARROWGAR, IN_PROGRESS); + instance->SetBossState(DATA_LORD_MARROWGAR, IN_PROGRESS); } void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); - if (pInstance) - pInstance->SetData(DATA_LORD_MARROWGAR, DONE); + instance->SetBossState(DATA_LORD_MARROWGAR, DONE); } void JustReachedHome() { - if(pInstance) - pInstance->SetData(DATA_LORD_MARROWGAR, FAIL); + instance->SetBossState(DATA_LORD_MARROWGAR, FAIL); } void KilledUnit(Unit *victim) @@ -139,13 +135,11 @@ class boss_lord_marrowgar : public CreatureScript DoScriptText(SAY_ENTER_ZONE, me); bIntroDone = true; } - - ScriptedAI::MoveInLineOfSight(who); } void UpdateAI(const uint32 diff) { - if (!UpdateVictim()) + if (!UpdateVictim() || !CheckInRoom()) return; events.Update(diff); @@ -239,9 +233,6 @@ class boss_lord_marrowgar : public CreatureScript } private: - - EventMap events; - InstanceScript* pInstance; bool bIntroDone; uint32 uiBoneStormDuration; float fBaseSpeed; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h index 1f025893840..d95f928d24e 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h @@ -39,9 +39,9 @@ enum eData DATA_SINDRAGOSA = 10, DATA_THE_LICH_KING = 11, - COMMAND_FAIL_BONED, - DATA_SAURFANG_EVENT_NPC, - DATA_SAURFANG_DOOR, + DATA_SAURFANG_EVENT_NPC = 12, + + COMMAND_FAIL_BONED = 13, }; #define MAX_ENCOUNTER 12 @@ -73,17 +73,17 @@ enum eCreatures enum eGameobjects { - DOODAD_ICECROWN_ICEWALL02 = 201910, - ICEWALL = 201911, - LORD_MARROWGAR_S_ENTRANCE = 201857, - ORATORY_OF_THE_DAMNED_ENTRANCE = 201563, - LADY_DEATHWHISPER_ELEVATOR = 202220, - SAURFANG_S_DOOR = 201825, - DEATHBRINGER_S_CACHE_10N = 202239, - DEATHBRINGER_S_CACHE_25N = 202240, - DEATHBRINGER_S_CACHE_10H = 202238, - DEATHBRINGER_S_CACHE_25H = 202241, - SCOURGE_TRANSPORTER_SAURFANG = 202244, + GO_DOODAD_ICECROWN_ICEWALL02 = 201910, + GO_ICEWALL = 201911, + GO_LORD_MARROWGAR_S_ENTRANCE = 201857, + GO_ORATORY_OF_THE_DAMNED_ENTRANCE = 201563, + GO_LADY_DEATHWHISPER_ELEVATOR = 202220, + GO_SAURFANG_S_DOOR = 201825, + GO_DEATHBRINGER_S_CACHE_10N = 202239, + GO_DEATHBRINGER_S_CACHE_25N = 202240, + GO_DEATHBRINGER_S_CACHE_10H = 202238, + GO_DEATHBRINGER_S_CACHE_25H = 202241, + GO_SCOURGE_TRANSPORTER_SAURFANG = 202244, }; enum eAchievementCriteria diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp index 7ab328debd0..a68b4e15b92 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp @@ -43,17 +43,17 @@ class icecrown_citadel_teleport : public GameObjectScript player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to Light's Hammer.", GOSSIP_SENDER_ICC_PORT, LIGHT_S_HAMMER_TELEPORT); if (InstanceScript* pInstance = go->GetInstanceScript()) { - if (pInstance->GetData(DATA_LORD_MARROWGAR) == DONE) + if (pInstance->GetBossState(DATA_LORD_MARROWGAR) == DONE) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Oratory of the Damned.", GOSSIP_SENDER_ICC_PORT, ORATORY_OF_THE_DAMNED_TELEPORT); - if (pInstance->GetData(DATA_LADY_DEATHWHISPER) == DONE) + if (pInstance->GetBossState(DATA_LADY_DEATHWHISPER) == DONE) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Rampart of Skulls.", GOSSIP_SENDER_ICC_PORT, RAMPART_OF_SKULLS_TELEPORT); - if (pInstance->GetData(DATA_GUNSHIP_EVENT) == DONE) + if (pInstance->GetBossState(DATA_GUNSHIP_EVENT) == DONE) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Deathbringer's Rise.", GOSSIP_SENDER_ICC_PORT, DEATHBRINGER_S_RISE_TELEPORT); - if (pInstance->GetData(DATA_DEATHBRINGER_SAURFANG) == DONE) + if (pInstance->GetBossState(DATA_DEATHBRINGER_SAURFANG) == DONE) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Upper Spire.", GOSSIP_SENDER_ICC_PORT, UPPER_SPIRE_TELEPORT); - if (pInstance->GetData(DATA_VALITHRIA_DREAMWALKER) == DONE) + if (pInstance->GetBossState(DATA_VALITHRIA_DREAMWALKER) == DONE) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Sindragosa's Lair", GOSSIP_SENDER_ICC_PORT, SINDRAGOSA_S_LAIR_TELEPORT); - if (pInstance->GetData(DATA_PROFESSOR_PUTRICIDE) == DONE && pInstance->GetData(DATA_BLOOD_QUEEN_LANA_THEL) == DONE && pInstance->GetData(DATA_SINDRAGOSA) == DONE) + if (pInstance->GetBossState(DATA_PROFESSOR_PUTRICIDE) == DONE && pInstance->GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) == DONE && pInstance->GetBossState(DATA_SINDRAGOSA) == DONE) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to The Frozen Throne", GOSSIP_SENDER_ICC_PORT, FROZEN_THRONE_TELEPORT); } @@ -63,6 +63,7 @@ class icecrown_citadel_teleport : public GameObjectScript bool OnGossipSelect(Player* player, GameObject* /*go*/, uint32 sender, uint32 action) { + player->PlayerTalkClass->ClearMenus(); player->CLOSE_GOSSIP_MENU(); SpellEntry const* spell = sSpellStore.LookupEntry(action); if (!spell) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp index e7a5d6faf30..917d9469a51 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp @@ -19,6 +19,15 @@ #include "ScriptPCH.h" #include "icecrown_citadel.h" +static const DoorData doorData[8] = +{ + {GO_LORD_MARROWGAR_S_ENTRANCE, DATA_LORD_MARROWGAR, DOOR_TYPE_ROOM, BOUNDARY_N }, + {GO_ICEWALL, DATA_LORD_MARROWGAR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE}, + {GO_DOODAD_ICECROWN_ICEWALL02, DATA_LORD_MARROWGAR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE}, + {GO_ORATORY_OF_THE_DAMNED_ENTRANCE, DATA_LADY_DEATHWHISPER, DOOR_TYPE_ROOM, BOUNDARY_N }, + {0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE} // END +}; + class instance_icecrown_citadel : public InstanceMapScript { public: @@ -28,11 +37,9 @@ class instance_icecrown_citadel : public InstanceMapScript { instance_icecrown_citadel_InstanceMapScript(InstanceMap* pMap) : InstanceScript(pMap) { - memset(uiEncounterState, 0, MAX_ENCOUNTER*sizeof(uint32)); - memset(uiIcewall, 0, 2*sizeof(uint32)); - uiMarrowgarEntrance = 0; + SetBossNumber(MAX_ENCOUNTER); + LoadDoorData(doorData); uiLadyDeathwisperElevator = 0; - uiOratoryDoor = 0; uiDeathbringerSaurfang = 0; uiSaurfangDoor = 0; uiSaurfangEventNPC = 0; @@ -41,15 +48,6 @@ class instance_icecrown_citadel : public InstanceMapScript isBonedEligible = false; } - bool IsEncounterInProgress() const - { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (uiEncounterState[i] == IN_PROGRESS) - return true; - - return false; - } - void OnCreatureCreate(Creature* creature, bool /*add*/) { Map::PlayerList const &players = instance->GetPlayers(); @@ -82,84 +80,41 @@ class instance_icecrown_citadel : public InstanceMapScript } } - void OnGameObjectCreate(GameObject* pGo, bool /*add*/) + void OnGameObjectCreate(GameObject* pGo, bool add) { switch (pGo->GetEntry()) { - case DOODAD_ICECROWN_ICEWALL02: - uiIcewall[0] = pGo->GetGUID(); - if (GetData(DATA_LORD_MARROWGAR) == DONE) - HandleGameObject(uiIcewall[0], true, pGo); - break; - case ICEWALL: - uiIcewall[1] = pGo->GetGUID(); - if (GetData(DATA_LORD_MARROWGAR) == DONE) - HandleGameObject(uiIcewall[1], true, pGo); + case GO_DOODAD_ICECROWN_ICEWALL02: + case GO_ICEWALL: + case GO_LORD_MARROWGAR_S_ENTRANCE: + case GO_ORATORY_OF_THE_DAMNED_ENTRANCE: + AddDoor(pGo, add); break; - case LORD_MARROWGAR_S_ENTRANCE: - uiMarrowgarEntrance = pGo->GetGUID(); - if (GetData(DATA_LORD_MARROWGAR) == DONE) - HandleGameObject(uiMarrowgarEntrance, true, pGo); - break; - case ORATORY_OF_THE_DAMNED_ENTRANCE: - uiOratoryDoor = pGo->GetGUID(); - if (GetData(DATA_LADY_DEATHWHISPER) == DONE) - HandleGameObject(uiOratoryDoor, true, pGo); - break; - case LADY_DEATHWHISPER_ELEVATOR: + case GO_LADY_DEATHWHISPER_ELEVATOR: uiLadyDeathwisperElevator = pGo->GetGUID(); - if (GetData(DATA_LADY_DEATHWHISPER) == DONE) + if (GetBossState(DATA_LADY_DEATHWHISPER) == DONE) { pGo->SetUInt32Value(GAMEOBJECT_LEVEL, 0); pGo->SetGoState(GO_STATE_READY); } break; - case SAURFANG_S_DOOR: + case GO_SAURFANG_S_DOOR: uiSaurfangDoor = pGo->GetGUID(); break; - case DEATHBRINGER_S_CACHE_10N: - case DEATHBRINGER_S_CACHE_25N: - case DEATHBRINGER_S_CACHE_10H: - case DEATHBRINGER_S_CACHE_25H: + case GO_DEATHBRINGER_S_CACHE_10N: + case GO_DEATHBRINGER_S_CACHE_25N: + case GO_DEATHBRINGER_S_CACHE_10H: + case GO_DEATHBRINGER_S_CACHE_25H: uiDeathbringersCache = pGo->GetGUID(); break; - case SCOURGE_TRANSPORTER_SAURFANG: + case GO_SCOURGE_TRANSPORTER_SAURFANG: uiSaurfangTeleport = pGo->GetGUID(); - if (GetData(DATA_DEATHBRINGER_SAURFANG) == DONE) - { - HandleGameObject(uiSaurfangTeleport, true, pGo); - pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); - } break; default: break; } } - uint32 GetData(uint32 type) - { - switch (type) - { - case DATA_LORD_MARROWGAR: - case DATA_LADY_DEATHWHISPER: - case DATA_GUNSHIP_EVENT: - case DATA_DEATHBRINGER_SAURFANG: - case DATA_FESTERGUT: - case DATA_ROTFACE: - case DATA_PROFESSOR_PUTRICIDE: - case DATA_BLOOD_PRINCE_COUNCIL: - case DATA_BLOOD_QUEEN_LANA_THEL: - case DATA_VALITHRIA_DREAMWALKER: - case DATA_SINDRAGOSA: - case DATA_THE_LICH_KING: - return uiEncounterState[type]; - default: - break; - } - - return 0; - } - uint64 GetData64(uint32 type) { switch (type) @@ -168,8 +123,10 @@ class instance_icecrown_citadel : public InstanceMapScript return uiDeathbringerSaurfang; case DATA_SAURFANG_EVENT_NPC: return uiSaurfangEventNPC; - case DATA_SAURFANG_DOOR: + case GO_SAURFANG_S_DOOR: return uiSaurfangDoor; + case GO_SCOURGE_TRANSPORTER_SAURFANG: + return uiSaurfangTeleport; default: break; } @@ -177,66 +134,27 @@ class instance_icecrown_citadel : public InstanceMapScript return 0; } - void SetData(uint32 type, uint32 data) + bool SetBossState(uint32 type, EncounterState state) { + if (!InstanceScript::SetBossState(type, state)) + return false; + switch (type) { - case DATA_LORD_MARROWGAR: - uiEncounterState[type] = data; - switch (data) - { - case DONE: - HandleGameObject(uiIcewall[0], true); - HandleGameObject(uiIcewall[1], true); - HandleGameObject(uiMarrowgarEntrance, true); - break; - case NOT_STARTED: - HandleGameObject(uiIcewall[0], false); - HandleGameObject(uiIcewall[1], false); - HandleGameObject(uiMarrowgarEntrance, true); - break; - case IN_PROGRESS: - HandleGameObject(uiMarrowgarEntrance, false); - break; - default: - break; - } - break; case DATA_LADY_DEATHWHISPER: - uiEncounterState[type] = data; - switch (data) - { - case DONE: - // TEMPORARY, SKIP GUNSHIP - uiEncounterState[DATA_GUNSHIP_EVENT] = DONE; - HandleGameObject(uiOratoryDoor, true); - if (GameObject* elevator = instance->GetGameObject(uiLadyDeathwisperElevator)) - { - elevator->SetUInt32Value(GAMEOBJECT_LEVEL, 0); - elevator->SetGoState(GO_STATE_READY); - } - break; - case IN_PROGRESS: - HandleGameObject(uiOratoryDoor, false); - break; - case NOT_STARTED: - HandleGameObject(uiOratoryDoor, true); - break; - default: - break; - } - break; - case DATA_GUNSHIP_EVENT: - uiEncounterState[type] = data; + SetBossState(DATA_GUNSHIP_EVENT, state); // TEMP HACK UNTIL GUNSHIP SCRIPTED + if (state == DONE) + if (GameObject* elevator = instance->GetGameObject(uiLadyDeathwisperElevator)) + { + elevator->SetUInt32Value(GAMEOBJECT_LEVEL, 0); + elevator->SetGoState(GO_STATE_READY); + } break; case DATA_DEATHBRINGER_SAURFANG: - uiEncounterState[type] = data; - switch (data) + switch (state) { case DONE: - if (GameObject* lootCache = instance->GetGameObject(uiDeathbringersCache)) - if (!lootCache->isSpawned()) - lootCache->SetRespawnTime(7*DAY); + DoRespawnGameObject(uiDeathbringersCache, 7*DAY); case NOT_STARTED: if (GameObject* teleporter = instance->GetGameObject(uiSaurfangTeleport)) { @@ -244,13 +162,6 @@ class instance_icecrown_citadel : public InstanceMapScript teleporter->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); } break; - case IN_PROGRESS: - if (GameObject* teleporter = instance->GetGameObject(uiSaurfangTeleport)) - { - HandleGameObject(uiSaurfangTeleport, false, teleporter); - teleporter->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); - } - break; default: break; } @@ -263,18 +174,22 @@ class instance_icecrown_citadel : public InstanceMapScript case DATA_VALITHRIA_DREAMWALKER: case DATA_SINDRAGOSA: case DATA_THE_LICH_KING: - uiEncounterState[type] = data; break; + } + + return true; + } + void SetData(uint32 type, uint32 data) + { + switch (type) + { case COMMAND_FAIL_BONED: isBonedEligible = data ? true : false; break; default: break; } - - if (data == DONE && type < MAX_ENCOUNTER) - SaveToDB(); } bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* /*source*/, Unit const* /*target*/, uint32 /*miscvalue1*/) @@ -298,9 +213,7 @@ class instance_icecrown_citadel : public InstanceMapScript OUT_SAVE_INST_DATA; std::ostringstream saveStream; - saveStream << "I C "; - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - saveStream << uiEncounterState[i] << " "; + saveStream << "I C " << GetBossSaveData(); OUT_SAVE_INST_DATA_COMPLETE; return saveStream.str(); @@ -327,9 +240,9 @@ class instance_icecrown_citadel : public InstanceMapScript { uint32 tmpState; loadStream >> tmpState; - if (tmpState == IN_PROGRESS) + if (tmpState == IN_PROGRESS || tmpState > SPECIAL) tmpState = NOT_STARTED; - uiEncounterState[i] = tmpState; + SetBossState(i, EncounterState(tmpState)); } } else OUT_LOAD_INST_DATA_FAIL; @@ -337,11 +250,7 @@ class instance_icecrown_citadel : public InstanceMapScript } private: - uint32 uiEncounterState[MAX_ENCOUNTER]; - uint64 uiIcewall[2]; - uint64 uiMarrowgarEntrance; uint64 uiLadyDeathwisperElevator; - uint64 uiOratoryDoor; uint64 uiDeathbringerSaurfang; uint64 uiSaurfangDoor; uint64 uiSaurfangEventNPC; // Muradin Bronzebeard or High Overlord Saurfang |