aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp47
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp23
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp25
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h28
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp13
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp195
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