aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedCreature.cpp8
-rwxr-xr-xsrc/server/game/Instances/InstanceScript.cpp11
-rwxr-xr-xsrc/server/game/Instances/InstanceScript.h7
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp21
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp15
-rwxr-xr-xsrc/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp21
-rwxr-xr-xsrc/server/scripts/Northrend/IcecrownCitadel/boss_festergut.cpp15
-rwxr-xr-xsrc/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp15
-rwxr-xr-xsrc/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp8
-rwxr-xr-xsrc/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp23
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp15
-rwxr-xr-xsrc/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h23
-rwxr-xr-xsrc/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp11
-rwxr-xr-xsrc/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp88
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;