Icecrown_Citadel

diff -r 4642400c2daa src/scripts/CMakeLists.txt
--- a/src/scripts/CMakeLists.txt	Sat Feb 20 20:59:09 2010 +0200
+++ b/src/scripts/CMakeLists.txt	Sat Feb 20 21:00:13 2010 +0200
@@ -363,6 +363,14 @@
    northrend/naxxramas/boss_thaddius.cpp
    northrend/naxxramas/naxxramas.h
    northrend/naxxramas/instance_naxxramas.cpp
+   northrend/Icecrown_Citadel/boss_lady_deathwhisper.cpp
+   northrend/Icecrown_Citadel/boss_lord_marrowgar.cpp
+   northrend/Icecrown_Citadel/citadel_transporter.cpp
+   northrend/Icecrown_Citadel/instance_icecrown_citadel.cpp
+   northrend/Icecrown_Citadel/instance_icecrown_citadel.h
+   northrend/Icecrown_Citadel/Lower_Spire_Trash.cpp
+   northrend/Icecrown_Citadel/QuelDelar.cpp
+   northrend/Icecrown_Citadel/Shadowmourne.cpp
    northrend/nexus/eye_of_eternity/instance_eye_of_eternity.cpp
    northrend/nexus/eye_of_eternity/boss_malygos.cpp
    northrend/nexus/eye_of_eternity/eye_of_eternity.h
diff -r 4642400c2daa src/scripts/northrend/Icecrown_Citadel/Lower_Spire_Trash.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/scripts/northrend/Icecrown_Citadel/Lower_Spire_Trash.cpp	Sat Feb 20 21:00:13 2010 +0200
@@ -0,0 +1,907 @@
+/* Copyright (C) 2006 - 2010 TrinityCore <https://www.trinitycore.org/>
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "ScriptedPch.h"
+#include "instance_icecrown_citadel.h"
+
+/***************************************SPELLS*************************************/
+//Nerub'ar Broodkeeper
+#define SPELL_CRYPTSCARABS                RAID_MODE(70965,70965)
+#define SPELL_DARKMENDING                 RAID_MODE(71020,71020)
+#define SPELL_WEBWRAP                     RAID_MODE(70980,70980)
+
+//The Damned
+#define SPELL_BONEFLURRY                  RAID_MODE(70960,70960)
+#define SPELL_SHATTEREDBONES              RAID_MODE(70961,70961)
+
+//Servant of the Throne
+#define SPELL_GLACIALBLAST                 RAID_MODE(71029,71029)
+
+//Ancient Skeletal Soldier
+#define SPELL_SHIELDBASH                  RAID_MODE(70964,70964)
+
+//Deathbound Ward
+#define SPELL_DISRUPTINGSHOUT             RAID_MODE(70122,70122)
+#define SPELL_SABERLASH                   RAID_MODE(70121,70121)
+
+//Deathspeaker Attendant
+#define SPELL_SHADOWBOLT                  RAID_MODE(69387,69387)
+#define SPELL_SHADOWNOVA                  RAID_MODE(69355,71106)
+
+//Deathspeaker Disciple
+#define SPELL_DARKBLESSING				  RAID_MODE(69391,69391)
+#define SPELL_SHADOWBOLT2                 RAID_MODE(69387,69387)
+#define SPELL_SHADOWMEND                  RAID_MODE(69389,71107)
+
+//Deathspeaker High Priest
+#define SPELL_AURAOFDARKNESS              RAID_MODE(69491,69491)
+#define SPELL_DARKRECKONING               RAID_MODE(69483,69483)
+
+//Deathspeaker Servant
+#define SPELL_CHAOSBOLT					  RAID_MODE(69576,71108)
+#define SPELL_CONSUMINGSHADOWS            RAID_MODE(69405,69405)
+#define SPELL_CURSEOFAGONY                RAID_MODE(69404,71112)
+
+//Deathspeaker Zealot
+#define SPELL_SHADOWCLEAVE                RAID_MODE(69492,69492)
+
+//Cult Adherant
+#define SPELL_CURSEOFTRPOR                RAID_MODE(71237,71237)
+#define SPELL_DARKEMPOWERMENT             RAID_MODE(70901,70901)
+#define SPELL_DARKMARTYDOM                RAID_MODE(70903,72498)
+#define SPELL_DEATHCHILLBLAST             RAID_MODE(70594,72005)
+#define SPELL_DEATHCHILLBLAST_EM          RAID_MODE(70906,72485)
+#define SPELL_SHROUDOFTHEOCCULT           RAID_MODE(70768,70768)
+#define COSMETIC_TELEPORT                 52096
+
+//Cult Fanatic
+#define SPELL_DARKMARTYRDOM               RAID_MODE(71236,72495)
+#define SPELL_DARKTRANSFORMATION          RAID_MODE(70900,70900)
+#define SPELL_NECROTICSTRIKE              RAID_MODE(70659,72490)
+#define SPELL_SHADOWCLEAVE                RAID_MODE(70670,72006)
+#define SPELL_VAMPIRICMIGHT               RAID_MODE(70674,70674)
+
+/****************************************EVENTS************************************/
+//Nerub'ar Broodkeeper
+#define EVENT_CRYPTSCARABS          1
+#define EVENT_DARKMENDING           2
+#define EVENT_WEBWRAP               3
+
+//The Damned
+#define EVENT_BONEFLURRY            4
+#define EVENT_SHATTEREDBONES        5
+
+//Servant of the Throne
+#define EVENT_GLACIALBLAST          6
+
+//Ancient Skeletal Soldier
+#define EVENT_SHIELDBASH            7
+
+//Deathbound Ward
+#define EVENT_DISRUPTINGSHOUT       8
+#define EVENT_SABERLASH             9
+
+//Deathspeaker Attendant
+#define EVENT_SHADOWBOLT            10
+#define EVENT_SHADOWNOVA            11
+
+//Deathspeaker Disciple
+#define EVENT_SHADOWBOLT2           12
+#define EVENT_DARKBLESSING          13
+#define EVENT_SHADOWMEND            14
+
+//Deathspeaker High Priest
+#define EVENT_DARKRECKONING         15
+
+//Deathspeaker Servant
+#define EVENT_CHAOSBOLT             16
+#define EVENT_CONSUMINGSHADOWS      17
+#define EVENT_CURSEOFAGONY          18
+
+//Deathspeaker Zealot
+#define EVENT_SHADOWCLEAVE          19
+
+//Cult Adherant
+#define EVENT_CURSEOFTRPOR          20
+#define EVENT_DARKEMPOWERMENT       21
+#define EVENT_DARKMARTYDOM          22
+#define EVENT_DEATHCHILLBLAST       23
+#define EVENT_SHROUDOFTHEOCCULT     24
+
+//Cult Fanatic
+#define EVENT_DARKMARTYRDOM         25
+#define EVENT_DARKTRANSFORMATION    26
+#define EVENT_NECROTICSTRIKE        27
+#define EVENT_SHADOWCLEAVE          28
+#define EVENT_VAMPIRICMIGHT         29
+
+
+/*****************************MARROWGAR TRASH****************************/
+struct npc_NerubarBroodkeeperAI: public ScriptedAI
+{
+    npc_NerubarBroodkeeperAI(Creature *c) : ScriptedAI(c)
+    {
+    }
+    EventMap events;
+
+    void Reset()
+    {
+        events.Reset();
+    }
+
+    void EnterCombat(Unit* who)
+    {
+    events.ScheduleEvent(EVENT_CRYPTSCARABS, 10000);
+	events.ScheduleEvent(EVENT_DARKMENDING, 17800);
+	events.ScheduleEvent(EVENT_WEBWRAP, 12000);
+    }
+
+    void UpdateAI(const uint32 diff)
+    {
+         //Return since we have no target
+        if (!UpdateVictim())
+            return;
+
+        events.Update(diff);
+
+        if (me->hasUnitState(UNIT_STAT_CASTING))
+            return;
+
+        while(uint32 eventId = events.ExecuteEvent())
+        {
+            switch(eventId)
+            {
+                case EVENT_CRYPTSCARABS:
+					if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
+                    DoCast(pTarget, SPELL_CRYPTSCARABS);
+                    events.RescheduleEvent(EVENT_CRYPTSCARABS, 12000);
+                    return;
+                case EVENT_DARKMENDING:
+                    DoCast(me, SPELL_DARKMENDING);
+                    events.RescheduleEvent(EVENT_DARKMENDING, 17800);
+                    return;
+                case EVENT_WEBWRAP:
+					if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
+                    DoCast(pTarget, SPELL_WEBWRAP);
+                    events.RescheduleEvent(EVENT_WEBWRAP, 15000);
+                    return;
+            }
+        }
+        DoMeleeAttackIfReady();
+    }
+};
+
+struct npc_TheDamnedAI: public ScriptedAI
+{
+    npc_TheDamnedAI(Creature *c) : ScriptedAI(c)
+    {
+    }
+    EventMap events;
+
+    void Reset()
+    {
+        events.Reset();
+    }
+
+    void EnterCombat(Unit* who)
+    {
+    events.ScheduleEvent(EVENT_BONEFLURRY, 8000);
+    }
+
+	void JustDied(Unit* who)
+	{
+	DoCastAOE(SPELL_SHATTEREDBONES);
+	}
+
+
+    void UpdateAI(const uint32 diff)
+    {
+         //Return since we have no target
+        if (!UpdateVictim())
+            return;
+
+        events.Update(diff);
+
+        if (me->hasUnitState(UNIT_STAT_CASTING))
+            return;
+
+        while(uint32 eventId = events.ExecuteEvent())
+        {
+            switch(eventId)
+            {
+                case EVENT_BONEFLURRY:
+                    DoCast(me, SPELL_BONEFLURRY, 1);
+                    events.RescheduleEvent(EVENT_BONEFLURRY, 15000);
+                    return;
+            }
+        }
+        DoMeleeAttackIfReady();
+    }
+};
+
+struct npc_ServantoftheThroneAI: public ScriptedAI
+{
+    npc_ServantoftheThroneAI(Creature *c) : ScriptedAI(c)
+    {
+    }
+    EventMap events;
+
+    void Reset()
+    {
+        events.Reset();
+    }
+
+    void EnterCombat(Unit* who)
+    {
+    events.ScheduleEvent(EVENT_GLACIALBLAST, 13000);
+    }
+
+    void UpdateAI(const uint32 diff)
+    {
+         //Return since we have no target
+        if (!UpdateVictim())
+            return;
+
+        events.Update(diff);
+
+        if (me->hasUnitState(UNIT_STAT_CASTING))
+            return;
+
+        while(uint32 eventId = events.ExecuteEvent())
+        {
+            switch(eventId)
+            {
+                case EVENT_GLACIALBLAST:
+                    DoCastAOE(SPELL_GLACIALBLAST);
+                    events.RescheduleEvent(EVENT_GLACIALBLAST, 8000);
+                    return;
+            }
+        }
+        DoMeleeAttackIfReady();
+    }
+};
+
+struct npc_AncientSkeletalSoldierAI: public ScriptedAI
+{
+    npc_AncientSkeletalSoldierAI(Creature *c) : ScriptedAI(c)
+    {
+    }
+    EventMap events;
+
+    void Reset()
+    {
+        events.Reset();
+    }
+
+    void EnterCombat(Unit* who)
+    {
+    events.ScheduleEvent(EVENT_SHIELDBASH, 8000);
+    }
+
+    void UpdateAI(const uint32 diff)
+    {
+         //Return since we have no target
+        if (!UpdateVictim())
+            return;
+
+        events.Update(diff);
+
+        if (me->hasUnitState(UNIT_STAT_CASTING))
+            return;
+
+        while(uint32 eventId = events.ExecuteEvent())
+        {
+            switch(eventId)
+            {
+                case EVENT_SHIELDBASH:
+                    DoCast(me->getVictim(), SPELL_SHIELDBASH);
+                    events.RescheduleEvent(EVENT_SHIELDBASH, 8000);
+                    return;
+            }
+        }
+        DoMeleeAttackIfReady();
+    }
+};
+
+struct npc_DeathboundWardAI: public ScriptedAI
+{
+    npc_DeathboundWardAI(Creature *c) : ScriptedAI(c)
+    {
+    }
+    EventMap events;
+
+    void Reset()
+    {
+        events.Reset();
+    }
+
+    void EnterCombat(Unit* who)
+    {
+    events.ScheduleEvent(EVENT_DISRUPTINGSHOUT, 8000);
+    events.ScheduleEvent(EVENT_SABERLASH, 8000);
+    }
+
+    void UpdateAI(const uint32 diff)
+    {
+         //Return since we have no target
+        if (!UpdateVictim())
+            return;
+
+        events.Update(diff);
+
+        if (me->hasUnitState(UNIT_STAT_CASTING))
+            return;
+
+        while(uint32 eventId = events.ExecuteEvent())
+        {
+            switch(eventId)
+            {
+                case EVENT_DISRUPTINGSHOUT:
+                    DoCast(me, SPELL_DISRUPTINGSHOUT);
+                    events.RescheduleEvent(EVENT_DISRUPTINGSHOUT, 8000);
+                    return;
+                case EVENT_SABERLASH:
+                    DoCast(me->getVictim(), SPELL_SABERLASH);
+                    events.RescheduleEvent(EVENT_SABERLASH, 8000);
+                    return;
+            }
+        }
+        DoMeleeAttackIfReady();
+    }
+};
+
+/*****************************DEATHWHISPER TRASH****************************/
+struct npc_DeathspeakerAttedantAI: public ScriptedAI
+{
+    npc_DeathspeakerAttedantAI(Creature *c) : ScriptedAI(c)
+    {
+    }
+    EventMap events;
+
+    void Reset()
+    {
+        events.Reset();
+    }
+
+    void EnterCombat(Unit* who)
+    {
+    events.ScheduleEvent(EVENT_SHADOWBOLT, 8000);
+    events.ScheduleEvent(EVENT_SHADOWNOVA, 23000);
+    }
+
+    void UpdateAI(const uint32 diff)
+    {
+         //Return since we have no target
+        if (!UpdateVictim())
+            return;
+
+        events.Update(diff);
+
+        if (me->hasUnitState(UNIT_STAT_CASTING))
+            return;
+
+        while(uint32 eventId = events.ExecuteEvent())
+        {
+            switch(eventId)
+            {
+                case EVENT_SHADOWBOLT:
+					if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
+                    DoCast(pTarget, SPELL_SHADOWBOLT);
+                    events.RescheduleEvent(EVENT_SHADOWBOLT, 8000);
+                    return;
+                case EVENT_SHADOWNOVA:
+                    DoCastAOE(SPELL_SHADOWNOVA);
+                    events.RescheduleEvent(EVENT_SHADOWNOVA, 17000);
+                    return;
+            }
+        }
+        DoMeleeAttackIfReady();
+    }
+};
+
+struct npc_DeathspeakerDiscipleAI: public ScriptedAI
+{
+    npc_DeathspeakerDiscipleAI(Creature *c) : ScriptedAI(c)
+    {
+    }
+    EventMap events;
+
+    void Reset()
+    {
+        events.Reset();
+    }
+
+    void EnterCombat(Unit* who)
+    {
+    events.ScheduleEvent(EVENT_SHADOWBOLT2, 8000);
+    }
+
+    void UpdateAI(const uint32 diff)
+    {
+         //Return since we have no target
+        if (!UpdateVictim())
+            return;
+
+        events.Update(diff);
+
+        if (me->hasUnitState(UNIT_STAT_CASTING))
+            return;
+
+        while(uint32 eventId = events.ExecuteEvent())
+        {
+            switch(eventId)
+            {
+                case EVENT_DARKBLESSING:
+					if(Unit* pTarget = m_creature->SelectNearestTarget(45))
+					if(pTarget->GetHealth() == pTarget->GetHealth() * 100 / pTarget->GetMaxHealth() && pTarget->IsFriendlyTo(m_creature))
+                    DoCast(pTarget, SPELL_DARKBLESSING);
+                    events.RescheduleEvent(EVENT_DARKBLESSING, 20000);
+                    return;
+                case EVENT_SHADOWBOLT2:
+					if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
+                    DoCast(pTarget, SPELL_SHADOWBOLT2);
+                    events.RescheduleEvent(EVENT_SHADOWBOLT2, 8000);
+                    return;
+                case EVENT_SHADOWMEND:
+					if(Unit* pTarget = m_creature->SelectNearestTarget(45))
+					if(pTarget->GetHealth() == pTarget->GetHealth() * 100 / pTarget->GetMaxHealth() && pTarget->IsFriendlyTo(m_creature))
+                    DoCast(pTarget, SPELL_SHADOWMEND);
+                    events.RescheduleEvent(EVENT_SHADOWMEND, 25000);
+                    return;
+            }
+        }
+        DoMeleeAttackIfReady();
+    }
+};
+
+struct npc_DeathspeakerHighPriestAI: public ScriptedAI
+{
+    npc_DeathspeakerHighPriestAI(Creature *c) : ScriptedAI(c)
+    {
+    }
+    EventMap events;
+
+    void Reset()
+    {
+        events.Reset();
+    }
+
+    void EnterCombat(Unit* who)
+    {
+    events.ScheduleEvent(EVENT_DARKRECKONING, 10000);
+    DoCast(me, SPELL_AURAOFDARKNESS);
+    }
+
+    void UpdateAI(const uint32 diff)
+    {
+         //Return since we have no target
+        if (!UpdateVictim())
+            return;
+
+        events.Update(diff);
+
+        if (me->hasUnitState(UNIT_STAT_CASTING))
+            return;
+
+        while(uint32 eventId = events.ExecuteEvent())
+        {
+            switch(eventId)
+            {
+                case EVENT_DARKRECKONING:
+					if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
+                    DoCast(pTarget, SPELL_DARKRECKONING);
+                    events.RescheduleEvent(EVENT_DARKRECKONING, 20000);
+                    return;
+            }
+        }
+        DoMeleeAttackIfReady();
+    }
+};
+
+struct npc_DeathspeakerServantAI: public ScriptedAI
+{
+    npc_DeathspeakerServantAI(Creature *c) : ScriptedAI(c)
+    {
+    }
+    EventMap events;
+
+    void Reset()
+    {
+        events.Reset();
+    }
+
+    void EnterCombat(Unit* who)
+    {
+    events.ScheduleEvent(EVENT_CHAOSBOLT, 15000);
+    events.ScheduleEvent(EVENT_CONSUMINGSHADOWS, 13000);
+    events.ScheduleEvent(EVENT_CURSEOFAGONY, 10000);
+    }
+
+    void UpdateAI(const uint32 diff)
+    {
+         //Return since we have no target
+        if (!UpdateVictim())
+            return;
+
+        events.Update(diff);
+
+        if (me->hasUnitState(UNIT_STAT_CASTING))
+            return;
+
+        while(uint32 eventId = events.ExecuteEvent())
+        {
+            switch(eventId)
+            {
+                case EVENT_CHAOSBOLT:
+					if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
+                    DoCast(pTarget, SPELL_CHAOSBOLT);
+                    events.RescheduleEvent(EVENT_CHAOSBOLT, 15000);
+                    return;
+                case EVENT_CONSUMINGSHADOWS:
+					if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
+                    DoCast(pTarget, SPELL_CONSUMINGSHADOWS);
+                    events.RescheduleEvent(EVENT_CONSUMINGSHADOWS, 13000);
+                    return;
+                case EVENT_CURSEOFAGONY:
+					if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
+                    DoCast(pTarget, SPELL_CURSEOFAGONY);
+                    events.RescheduleEvent(EVENT_CURSEOFAGONY, 17000);
+                    return;
+            }
+        }
+        DoMeleeAttackIfReady();
+    }
+};
+
+struct npc_DeathspeakerZealotAI: public ScriptedAI
+{
+    npc_DeathspeakerZealotAI(Creature *c) : ScriptedAI(c)
+    {
+    }
+    EventMap events;
+
+    void Reset()
+    {
+        events.Reset();
+    }
+
+    void EnterCombat(Unit* who)
+    {
+    events.ScheduleEvent(EVENT_SHADOWCLEAVE, 8000);
+    }
+
+    void UpdateAI(const uint32 diff)
+    {
+         //Return since we have no target
+        if (!UpdateVictim())
+            return;
+
+        events.Update(diff);
+
+        if (me->hasUnitState(UNIT_STAT_CASTING))
+            return;
+
+        while(uint32 eventId = events.ExecuteEvent())
+        {
+            switch(eventId)
+            {
+                case EVENT_SHADOWCLEAVE:
+                    DoCast(me->getVictim(), SPELL_SHADOWCLEAVE);
+                    events.RescheduleEvent(EVENT_SHADOWCLEAVE, 8000);
+                    return;
+            }
+        }
+        DoMeleeAttackIfReady();
+    }
+};
+
+struct npc_CultAdherentAI: public ScriptedAI
+{
+    npc_CultAdherentAI(Creature *c) : ScriptedAI(c)
+    {
+    }
+    EventMap events;
+
+	bool bReanimated;
+	bool bEmpowered;
+
+    void Reset()
+    {
+        events.Reset();
+		bEmpowered = false;
+		bReanimated = false;
+    }
+
+    void JustSummoned(Creature* summoned)
+    {
+        if (Unit* target = SelectUnit(SELECT_TARGET_TOPAGGRO,0))
+            summoned->AI()->AttackStart(target);
+
+        DoCast(COSMETIC_TELEPORT);
+    }
+
+    void Aggro(Unit* pWho)
+    {
+        m_creature->SetInCombatWithZone();
+    }
+
+
+
+    void EnterCombat(Unit* who)
+    {
+    events.ScheduleEvent(EVENT_CURSEOFTRPOR, 10000);
+    events.ScheduleEvent(EVENT_DARKEMPOWERMENT, 30000);
+    events.ScheduleEvent(EVENT_DEATHCHILLBLAST, 20000);
+    events.ScheduleEvent(EVENT_SHROUDOFTHEOCCULT, 15000);
+
+    DoCast(COSMETIC_TELEPORT);
+    }
+
+    void UpdateAI(const uint32 diff)
+    {
+         //Return since we have no target
+        if (!UpdateVictim())
+            return;
+
+        events.Update(diff);
+
+        if (me->hasUnitState(UNIT_STAT_CASTING))
+            return;
+
+        while(uint32 eventId = events.ExecuteEvent())
+        {
+            switch(eventId)
+            {
+                case EVENT_CURSEOFTRPOR:
+					if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
+                    DoCast(pTarget, SPELL_CURSEOFTRPOR);
+                    events.RescheduleEvent(EVENT_CURSEOFTRPOR, 8000);
+                    return;
+                    
+                case EVENT_DARKEMPOWERMENT:
+                    DoCast(me, RAND(SPELL_DARKEMPOWERMENT,SPELL_DARKMARTYDOM));
+                    events.RescheduleEvent(EVENT_DARKEMPOWERMENT, 9999999);
+					bEmpowered = true;
+                    return;
+                    
+                case EVENT_DEATHCHILLBLAST:
+					if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
+					if (bEmpowered = false)
+					{
+                    DoCast(pTarget, SPELL_DEATHCHILLBLAST);
+					} else {
+					DoCast(pTarget, SPELL_DEATHCHILLBLAST_EM);
+					}
+                    events.RescheduleEvent(EVENT_DEATHCHILLBLAST, 8000);
+                    return;
+				case EVENT_SHROUDOFTHEOCCULT:
+					DoCast(me, SPELL_SHROUDOFTHEOCCULT);
+					events.RescheduleEvent(EVENT_SHROUDOFTHEOCCULT, 8000);
+					return;
+            }
+        }
+        DoMeleeAttackIfReady();
+    }
+};
+
+struct npc_CultFanaticAI: public ScriptedAI
+{
+    npc_CultFanaticAI(Creature *c) : ScriptedAI(c)
+    {
+    }
+    EventMap events;
+
+	bool Martyr;
+	bool Transform;
+
+    void Reset()
+    {
+        events.Reset();
+
+		Martyr = false;
+		Transform = false;
+    }
+
+    void Aggro(Unit* pWho)
+    {
+        m_creature->SetInCombatWithZone();
+    }
+
+
+    void EnterCombat(Unit* who)
+    {
+    events.ScheduleEvent(EVENT_DARKMARTYRDOM, 45000);
+    events.ScheduleEvent(EVENT_NECROTICSTRIKE, 8000);
+    events.ScheduleEvent(EVENT_SHADOWCLEAVE, 8000);
+    events.ScheduleEvent(EVENT_VAMPIRICMIGHT, 8000);
+
+    DoCast(COSMETIC_TELEPORT);
+    }
+
+    void JustSummoned(Creature* summoned)
+    {
+        if (Unit* target = SelectUnit(SELECT_TARGET_TOPAGGRO,0))
+            summoned->AI()->AttackStart(target);
+
+        DoCast(COSMETIC_TELEPORT);
+    }
+
+    void UpdateAI(const uint32 diff)
+    {
+         //Return since we have no target
+        if (!UpdateVictim())
+            return;
+
+        events.Update(diff);
+
+        if (me->hasUnitState(UNIT_STAT_CASTING))
+            return;
+
+        while(uint32 eventId = events.ExecuteEvent())
+        {
+            switch(eventId)
+            {
+                case EVENT_DARKMARTYRDOM:
+					if ((Martyr = false) && (Transform = false))
+                    DoCast(me, RAND(SPELL_DARKMARTYRDOM, SPELL_DARKTRANSFORMATION));
+                    events.RescheduleEvent(EVENT_DARKMARTYRDOM, 999999);
+                    return;
+                case EVENT_NECROTICSTRIKE:
+                    DoCast(me->getVictim(), SPELL_NECROTICSTRIKE);
+                    events.RescheduleEvent(EVENT_NECROTICSTRIKE, 13000);
+                    return;
+                case EVENT_SHADOWCLEAVE:
+                    DoCast(me->getVictim(), SPELL_SHADOWCLEAVE);
+                    events.RescheduleEvent(EVENT_SHADOWCLEAVE, 10000);
+                    return;
+                case EVENT_VAMPIRICMIGHT:
+                    DoCast(me, SPELL_VAMPIRICMIGHT);
+                    events.RescheduleEvent(EVENT_VAMPIRICMIGHT, 15000);
+                    return;
+            }
+        }
+        DoMeleeAttackIfReady();
+    }
+};
+
+
+/*****************************MARROWGAR TRASH****************************/
+CreatureAI* GetAI_npc_NerubarBroodkeeperAI(Creature* pCreature)
+{
+    return new npc_NerubarBroodkeeperAI (pCreature);
+}
+
+CreatureAI* GetAI_npc_TheDamnedAI(Creature* pCreature)
+{
+    return new npc_TheDamnedAI (pCreature);
+}
+
+CreatureAI* GetAI_npc_ServantoftheThroneAI(Creature* pCreature)
+{
+    return new npc_ServantoftheThroneAI (pCreature);
+}
+
+CreatureAI* GetAI_npc_AncientSkeletalSoldierAI(Creature* pCreature)
+{
+    return new npc_AncientSkeletalSoldierAI (pCreature);
+}
+
+CreatureAI* GetAI_npc_DeathboundWardAI(Creature* pCreature)
+{
+    return new npc_DeathboundWardAI (pCreature);
+}
+
+/*****************************DEATHWHISPER TRASH**************************/
+CreatureAI* GetAI_npc_DeathspeakerAttedantAI(Creature* pCreature)
+{
+    return new npc_DeathspeakerAttedantAI (pCreature);
+}
+
+CreatureAI* GetAI_npc_DeathspeakerDiscipleAI(Creature* pCreature)
+{
+    return new npc_DeathspeakerDiscipleAI (pCreature);
+}
+
+CreatureAI* GetAI_npc_DeathspeakerHighPriestAI(Creature* pCreature)
+{
+    return new npc_DeathspeakerHighPriestAI (pCreature);
+}
+
+CreatureAI* GetAI_npc_DeathspeakerServantAI(Creature* pCreature)
+{
+    return new npc_DeathspeakerServantAI (pCreature);
+}
+
+CreatureAI* GetAI_npc_DeathspeakerZealotAI(Creature* pCreature)
+{
+    return new npc_DeathspeakerZealotAI (pCreature);
+}
+
+CreatureAI* GetAI_npc_CultAdherentAI(Creature* pCreature)
+{
+    return new npc_CultAdherentAI (pCreature);
+}
+
+CreatureAI* GetAI_npc_CultFanaticAI(Creature* pCreature)
+{
+    return new npc_CultFanaticAI (pCreature);
+}
+
+void AddSC_LowerSpireTrash()
+{
+/*****************************MARROWGAR TRASH****************************/
+    Script *newscript;
+    newscript = new Script;
+    newscript->Name="npc_NerubarBroodkeeper";
+    newscript->GetAI = &GetAI_npc_NerubarBroodkeeperAI;
+    newscript->RegisterSelf();
+
+	newscript = new Script;
+    newscript->Name="npc_TheDamned";
+    newscript->GetAI = &GetAI_npc_TheDamnedAI;
+    newscript->RegisterSelf();
+
+	newscript = new Script;
+    newscript->Name="npc_ServantoftheThrone";
+    newscript->GetAI = &GetAI_npc_ServantoftheThroneAI;
+    newscript->RegisterSelf();
+
+    newscript = new Script;
+    newscript->Name="npc_AncientSkeletalSoldier";
+    newscript->GetAI = &GetAI_npc_AncientSkeletalSoldierAI;
+    newscript->RegisterSelf();
+
+    newscript = new Script;
+    newscript->Name="npc_DeathboundWard";
+    newscript->GetAI = &GetAI_npc_DeathboundWardAI;
+    newscript->RegisterSelf();
+
+/*****************************DEATHWHISPER TRASH**************************/
+    newscript = new Script;
+    newscript->Name="npc_DeathspeakerAttedant";
+    newscript->GetAI = &GetAI_npc_DeathspeakerAttedantAI;
+    newscript->RegisterSelf();
+
+    newscript = new Script;
+    newscript->Name="npc_DeathspeakerDisciple";
+    newscript->GetAI = &GetAI_npc_DeathspeakerDiscipleAI;
+    newscript->RegisterSelf();
+
+    newscript = new Script;
+    newscript->Name="npc_DeathspeakerHighPriest";
+    newscript->GetAI = &GetAI_npc_DeathspeakerHighPriestAI;
+    newscript->RegisterSelf();
+
+    newscript = new Script;
+    newscript->Name="npc_DeathspeakerServant";
+    newscript->GetAI = &GetAI_npc_DeathspeakerServantAI;
+    newscript->RegisterSelf();
+
+    newscript = new Script;
+    newscript->Name="npc_DeathspeakerZealot";
+    newscript->GetAI = &GetAI_npc_DeathspeakerZealotAI;
+    newscript->RegisterSelf();
+
+    newscript = new Script;
+    newscript->Name="npc_CultAdherent";
+    newscript->GetAI = &GetAI_npc_CultAdherentAI;
+    newscript->RegisterSelf();
+
+    newscript = new Script;
+    newscript->Name="npc_CultFanatic";
+    newscript->GetAI = &GetAI_npc_CultFanaticAI;
+    newscript->RegisterSelf();
+}
\ No newline at end of file
diff -r 4642400c2daa src/scripts/northrend/Icecrown_Citadel/QuelDelar.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/scripts/northrend/Icecrown_Citadel/QuelDelar.cpp	Sat Feb 20 21:00:13 2010 +0200
@@ -0,0 +1,19 @@
+/* Copyright (C) 2006 - 2010 TrinityCore <https://www.trinitycore.org/>
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "ScriptedPch.h"
+
+#define GOSSIP_SUNWELL     "I'm ready to enter the Sunwell."
diff -r 4642400c2daa src/scripts/northrend/Icecrown_Citadel/Shadowmourne.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/scripts/northrend/Icecrown_Citadel/Shadowmourne.cpp	Sat Feb 20 21:00:13 2010 +0200
@@ -0,0 +1,17 @@
+/* Copyright (C) 2006 - 2010 TrinityCore <https://www.trinitycore.org/>
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "ScriptedPch.h"
\ No newline at end of file
diff -r 4642400c2daa src/scripts/northrend/Icecrown_Citadel/boss_lady_deathwhisper.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/scripts/northrend/Icecrown_Citadel/boss_lady_deathwhisper.cpp	Sat Feb 20 21:00:13 2010 +0200
@@ -0,0 +1,315 @@
+/* Copyright (C) 2006 - 2010 TrinityCore <https://www.trinitycore.org/>
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "ScriptedPch.h"
+#include "instance_icecrown_citadel.h"
+
+#define SAY_INTRO_1                   -1609402
+#define SAY_INTRO_2                   -1609403
+#define SAY_INTRO_3                   -1609404
+#define SAY_INTRO_4                   -1609405
+#define SAY_INTRO_5                   -1609406
+#define SAY_INTRO_6                   -1609407
+#define SAY_INTRO_7                   -1609408
+#define SAY_AGGRO                     -1609409
+#define SAY_PHASE_2                   -1609410
+#define SAY_DARK_EMPOWERMENT          -1609411
+#define SAY_DARK_TRANSFORMATION       -1609412
+#define SAY_RAISE_DEAD                -1609413
+#define SAY_DOMINATE_MIND             -1609414
+#define SAY_ENRAGE                    -1609415
+#define SAY_DEATH                     -1609416
+#define SAY_SLAY_1                    -1609417
+#define SAY_SLAY_2                    -1609418
+
+
+#define SPELL_ENRAGE                   RAID_MODE(26662,26662)
+#define SPELL_DAD                      RAID_MODE(71001,72108)
+#define SPELL_FROSTBOLT                RAID_MODE(71420,72007)
+#define SPELL_FROSTBOLT_VOLLEY         RAID_MODE(72905,72906)
+#define SPELL_MANA_BARRIER             RAID_MODE(70842,70842)
+#define SPELL_SHADOW_BOLT              RAID_MODE(71254,72008)
+#define SPELL_TOUCH_OF_INSIGINIFANCE   RAID_MODE(71204,71204)
+#define SPELL_DARK_EMPOWERMENT         RAID_MODE(70901,70901)
+#define SPELL_DOMINATE_MIND            71289
+#define SPELL_HACK_HEAL                15068 // This is not right, but im just hackin it for now.
+
+#define EVENT_ENRAGE              1
+#define EVENT_DAD                 2
+#define EVENT_FROSTBOLT           3
+#define EVENT_FROSTBOLT_VOLLEY    4
+#define EVENT_MANA_BARRIER        5
+#define EVENT_SHADOW_BOLT         6
+#define EVENT_TOUCH_OF_INSI       7
+#define EVENT_DARK_EMPOWERMENT    8
+#define EVENT_DOMINATE_MIND  	  9
+#define EVENT_INTRO_1             10
+#define EVENT_INTRO_2             11
+#define EVENT_INTRO_3             12
+#define EVENT_INTRO_4             13
+#define EVENT_INTRO_5             14
+#define EVENT_INTRO_6             15
+#define EVENT_INTRO_7             16
+#define EVENT_SPAWN_LEFT          17
+#define EVENT_SPAWN_RIGHT         18
+
+// Not like I couldnt have just checked the NPCs in the DB, but thanks scriptdev2 people for the coords
+#define ADD_1X -619.006
+#define ADD_1Y 2158.104
+#define ADD_1Z 50.848
+
+#define ADD_2X -598.697
+#define ADD_2Y 2157.767
+#define ADD_2Z 50.848
+
+#define ADD_3X -577.992
+#define ADD_3Y 2156.989
+#define ADD_3Z 50.848
+
+#define ADD_4X -618.748
+#define ADD_4Y 2266.648
+#define ADD_4Z 50.849
+
+#define ADD_5X -598.573
+#define ADD_5Y 2266.870
+#define ADD_5Z 50.849
+
+#define ADD_6X -578.360
+#define ADD_6Y 2267.210
+#define ADD_6Z 50.849
+
+struct boss_DeathwhisperAI : public ScriptedAI
+{
+    boss_DeathwhisperAI(Creature *c) : ScriptedAI(c)
+    {
+        pInstance = c->GetInstanceData();
+
+        SpellEntry *TempSpell;
+        TempSpell = GET_SPELL(SPELL_MANA_BARRIER);
+        if (TempSpell && TempSpell->EffectTriggerSpell[0] != SPELL_HACK_HEAL)
+        {
+            TempSpell->EffectTriggerSpell[0] = SPELL_HACK_HEAL;
+        }
+    }
+    
+    ScriptedInstance* pInstance;
+    EventMap events;
+
+	bool Enraged;
+	bool deathwhisperintro;
+    uint8 Phase;
+
+    void Reset()
+    {
+		events.Reset();
+        
+        if (pInstance)
+          //  pInstance->SetData(DATA_DEATHWHISPER_EVENT, NOT_STARTED);
+
+		Enraged = false;
+		deathwhisperintro = false;
+        Phase = 1;
+    }
+
+    void EnterCombat(Unit* who)
+    {
+        if (pInstance)
+		{
+          //  pInstance->SetData(DATA_DEATHWHISPER_EVENT, IN_PROGRESS);
+		}
+		
+		Phase = 1;
+		DoScriptText(SAY_AGGRO, me);
+		events.ScheduleEvent(EVENT_ENRAGE, 600000);
+        events.ScheduleEvent(EVENT_SPAWN_LEFT, 20000);
+        events.ScheduleEvent(EVENT_DAD, 15000);
+        events.ScheduleEvent(EVENT_SHADOW_BOLT, 1);
+    }
+
+    // Mana Barrier is broken, it appears as though mana shields effects dont work either(?)
+    void DamageTaken(Unit *done_by, uint32 &damage)
+    {
+        if (m_creature->HasAura(SPELL_MANA_BARRIER))
+        {
+            m_creature->SetHealth(m_creature->GetHealth()+damage);
+            m_creature->SetPower(POWER_MANA,m_creature->GetPower(POWER_MANA)-damage);
+        }
+    }
+
+    void MoveInLineOfSight(Unit *who)
+    {
+        if (!deathwhisperintro && m_creature->IsWithinDistInMap(who,105.0f))
+        {
+			deathwhisperintro = true;
+			events.ScheduleEvent(EVENT_INTRO_1, 1);
+		}
+        ScriptedAI::MoveInLineOfSight(who);
+    }
+
+    void KilledUnit(Unit *victim)
+    {
+        if (victim == m_creature)
+            return;
+        DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), me);
+    }
+    
+    void UpdateAI(const uint32 diff)
+    {
+         //Return since we have no target
+        if (!UpdateVictim())
+            return;
+
+        events.Update(diff);
+
+        if (me->hasUnitState(UNIT_STAT_CASTING))
+            return;
+
+		if ((!me->HasAura(SPELL_MANA_BARRIER)) && (Phase = 1))
+		{
+			DoCast(me, SPELL_MANA_BARRIER);
+            DoStartNoMovement(m_creature->getVictim());
+		}
+
+        if (Phase == 1)
+        {
+            if ((m_creature->GetPower(POWER_MANA)*100 / m_creature->GetMaxPower(POWER_MANA)) < 1)
+            {
+                Phase = 2;
+                return;
+            }
+        }
+
+        if (Phase == 2)
+        {
+            if (m_creature->HasAura(SPELL_MANA_BARRIER))
+                m_creature->RemoveAurasDueToSpell(SPELL_MANA_BARRIER);
+        }
+
+        while(uint32 eventId = events.ExecuteEvent())
+        {
+            Creature* prightmob1= NULL;
+            Creature* prightmob2= NULL;
+            Creature* prightmob3= NULL;
+            Creature* pleftmob1= NULL;
+            Creature* pleftmob2= NULL;
+            Creature* pleftmob3= NULL;
+            switch(eventId)
+            {
+                case EVENT_INTRO_1:
+                    DoScriptText(SAY_INTRO_1, me);
+                    events.ScheduleEvent(EVENT_INTRO_2, 1500);
+                    return;
+                case EVENT_INTRO_2:
+                    DoScriptText(SAY_INTRO_2, me);
+					events.ScheduleEvent(EVENT_INTRO_3, 1500);
+                    return;
+                case EVENT_INTRO_3:
+                    DoScriptText(SAY_INTRO_3, me);
+					events.ScheduleEvent(EVENT_INTRO_4, 1500);
+                    return;
+                case EVENT_INTRO_4:
+                    DoScriptText(SAY_INTRO_4, me);
+					events.ScheduleEvent(EVENT_INTRO_5, 1500);
+                    return;
+                case EVENT_INTRO_5:
+                    DoScriptText(SAY_INTRO_5, me);
+					events.ScheduleEvent(EVENT_INTRO_6, 1500);
+                    return;
+                case EVENT_INTRO_6:
+                    DoScriptText(SAY_INTRO_6, me);
+					events.ScheduleEvent(EVENT_INTRO_7, 1500);
+                    return;
+                case EVENT_INTRO_7:
+                    DoScriptText(SAY_INTRO_7, me);
+                    return;
+				case EVENT_ENRAGE:
+                    DoCast(me->getVictim(), SPELL_ENRAGE);
+					DoScriptText( SAY_ENRAGE, m_creature);
+					events.ScheduleEvent(EVENT_ENRAGE, 300000);
+                    return;
+                // Why wouldnt this work with just pleftmobs?
+                case EVENT_SPAWN_LEFT:
+                    if (Phase = 1)
+                    {
+                    pleftmob1 = m_creature->SummonCreature(NPC_CULT_FANATIC,ADD_1X,ADD_1Y,ADD_1Z,1.532153,TEMPSUMMON_CORPSE_DESPAWN);
+                    pleftmob2 = m_creature->SummonCreature(NPC_CULT_ADHERENT,ADD_2X,ADD_2Y,ADD_2Z,1.532153,TEMPSUMMON_CORPSE_DESPAWN);
+                    pleftmob3 = m_creature->SummonCreature(NPC_CULT_FANATIC,ADD_3X,ADD_3Y,ADD_3Z,1.532153,TEMPSUMMON_CORPSE_DESPAWN);
+                    if (pleftmob1)
+                    {
+                    pleftmob1->setActive(true);
+                    pleftmob1->AI()->DoZoneInCombat();
+                    pleftmob2->setActive(true);
+                    pleftmob2->AI()->DoZoneInCombat();
+                    pleftmob3->setActive(true);
+                    pleftmob3->AI()->DoZoneInCombat();
+                    }
+                    events.ScheduleEvent(EVENT_SPAWN_RIGHT, 60000);
+                    }
+                    return;
+                // Why wouldn't this work just prightmobs?
+                case EVENT_SPAWN_RIGHT:
+                    if (Phase = 1)
+                    {
+                    prightmob1 = m_creature->SummonCreature(NPC_CULT_ADHERENT,ADD_4X,ADD_4Y,ADD_4Z,4.669165,TEMPSUMMON_CORPSE_DESPAWN);
+                    prightmob2 = m_creature->SummonCreature(NPC_CULT_FANATIC,ADD_5X,ADD_5Y,ADD_5Z,4.669165,TEMPSUMMON_CORPSE_DESPAWN);
+                    prightmob3 = m_creature->SummonCreature(NPC_CULT_ADHERENT,ADD_6X,ADD_6Y,ADD_6Z,4.669165,TEMPSUMMON_CORPSE_DESPAWN);
+                    if (prightmob2)
+                    {
+                    prightmob1->setActive(true);
+                    prightmob1->AI()->DoZoneInCombat();
+                    prightmob2->setActive(true);
+                    prightmob2->AI()->DoZoneInCombat();
+                    prightmob3->setActive(true);
+                    prightmob3->AI()->DoZoneInCombat();
+                    }
+                    events.ScheduleEvent(EVENT_SPAWN_LEFT, 60000);
+                    }
+                    return;
+				case EVENT_DAD:
+                    if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
+                    DoCast(pTarget, SPELL_DAD);
+					events.ScheduleEvent(EVENT_DAD, 20000);
+                    return;
+				case EVENT_SHADOW_BOLT:
+                    if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
+                    DoCast(pTarget, SPELL_SHADOW_BOLT);
+					events.ScheduleEvent(EVENT_SHADOW_BOLT, 5000);
+                    return;
+			}
+		}
+    }
+
+    void JustDied(Unit* killer)  
+    {
+			DoScriptText( SAY_DEATH, m_creature);
+		 //	if (pInstance)
+         //   pInstance->SetData(DATA_DEATHWHISPER_EVENT, DONE);
+    }
+};
+
+CreatureAI* GetAI_boss_Deathwhisper(Creature* pCreature)
+{
+    return new boss_DeathwhisperAI (pCreature);
+}
+
+void AddSC_boss_Deathwhisper()
+{
+    Script *newscript;
+    newscript = new Script;
+    newscript->Name="boss_Deathwhisper";
+    newscript->GetAI = &GetAI_boss_Deathwhisper;
+    newscript->RegisterSelf();
+}
\ No newline at end of file
diff -r 4642400c2daa src/scripts/northrend/Icecrown_Citadel/boss_lord_marrowgar.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/scripts/northrend/Icecrown_Citadel/boss_lord_marrowgar.cpp	Sat Feb 20 21:00:13 2010 +0200
@@ -0,0 +1,195 @@
+/* Copyright (C) 2006 - 2010 TrinityCore <https://www.trinitycore.org/>
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "ScriptedPch.h"
+#include "instance_icecrown_citadel.h"
+
+#define SAY_ENTER_ZONE            -1609392
+#define SAY_AGGRO                 -1609393
+#define SAY_BONE_STORM            -1609394
+#define SAY_BONESPIKE_1           -1609395
+#define SAY_BONESPIKE_2           -1609396
+#define SAY_BONESPIKE_3           -1609397
+#define SAY_SLAY_1                -1609398
+#define SAY_SLAY_2                -1609399
+#define SAY_DEATH                 -1609400
+#define SAY_ENRAGE                -1609401
+
+#define SPELL_SABERLASH            RAID_MODE(69055,70814)
+#define SPELL_COLDFLAME            RAID_MODE(69146,70823)
+#define SPELL_BONESPIKE            RAID_MODE(69057,69057)
+#define SPELL_BONESTORM            RAID_MODE(69076,69076)
+#define SPELL_ENRAGE               RAID_MODE(26662,26662)
+
+#define EVENT_SABERLASH           1
+#define EVENT_COLDFLAME           2
+#define EVENT_BONESPIKE           3
+#define EVENT_BONESTORM_1         4
+#define EVENT_BONESTORM_2         5
+#define EVENT_BONESTORM_3         6
+#define EVENT_BONESTORM_4         7
+#define EVENT_RESET               8
+#define EVENT_ENRAGE			  9
+
+struct boss_MarrowgarAI : public ScriptedAI
+{
+    boss_MarrowgarAI(Creature *c) : ScriptedAI(c)
+    {
+        pInstance = c->GetInstanceData();
+    }
+    
+    ScriptedInstance* pInstance;
+    EventMap events;
+
+	bool Enraged;
+	bool marrowgarintro;
+
+    void Reset()
+    {
+		events.Reset();
+        
+        if (pInstance)
+            pInstance->SetData(DATA_MARROWGAR_EVENT, NOT_STARTED);
+
+		Enraged = false;
+		marrowgarintro = false;
+    }
+
+    void EnterCombat(Unit* who)
+    {
+        if (pInstance)
+		{
+            pInstance->SetData(DATA_MARROWGAR_EVENT, IN_PROGRESS);
+		}
+
+		DoScriptText(SAY_AGGRO, me);
+		events.ScheduleEvent(EVENT_SABERLASH, 5000);
+		events.ScheduleEvent(EVENT_COLDFLAME, 20000);
+		events.ScheduleEvent(EVENT_BONESPIKE, 15000);
+		events.ScheduleEvent(EVENT_BONESTORM_1, 45000);
+		events.ScheduleEvent(EVENT_ENRAGE, 600000);
+    }
+
+    void MoveInLineOfSight(Unit *who)
+    {
+            if (!marrowgarintro && m_creature->IsWithinDistInMap(who,55.0f))
+            {
+                DoScriptText(SAY_ENTER_ZONE, m_creature);
+				marrowgarintro = true;
+			}
+        ScriptedAI::MoveInLineOfSight(who);
+    }
+
+    void KilledUnit(Unit *victim)
+    {
+        if (victim == m_creature)
+            return;
+        DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), me);
+    }
+    
+    void UpdateAI(const uint32 diff)
+    {
+         //Return since we have no target
+        if (!UpdateVictim())
+            return;
+
+        events.Update(diff);
+
+        if (me->hasUnitState(UNIT_STAT_CASTING))
+            return;
+
+        while(uint32 eventId = events.ExecuteEvent())
+        {
+            switch(eventId)
+            {
+                case EVENT_COLDFLAME:
+                    if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
+                    DoCast(pTarget, SPELL_COLDFLAME);
+                    events.ScheduleEvent(EVENT_COLDFLAME, 15000);
+                    return;
+                case EVENT_BONESPIKE:
+					if (!me->HasAura(SPELL_BONESTORM))
+					{
+					if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
+					DoCast(pTarget, SPELL_BONESPIKE);
+					DoScriptText(RAND(SAY_BONESPIKE_1,SAY_BONESPIKE_2,SAY_BONESPIKE_3), me);
+                    events.ScheduleEvent(EVENT_BONESPIKE, 15000);
+					}
+                    return;
+				//Hacky, but dont care. Start.
+                case EVENT_BONESTORM_1:
+					if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
+                    DoCast(pTarget, SPELL_BONESTORM);
+					DoScriptText( SAY_BONE_STORM, m_creature);
+                    events.ScheduleEvent(EVENT_BONESTORM_2, 7000);
+                    return;
+				//Spin 2
+                case EVENT_BONESTORM_2:
+					if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
+					DoCast(pTarget, SPELL_BONESTORM, 1);
+                    events.ScheduleEvent(EVENT_BONESTORM_3, 7000);
+                    return;
+				//Spin 3
+                case EVENT_BONESTORM_3:
+					if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
+					DoCast(pTarget, SPELL_BONESTORM, 1);
+                    events.ScheduleEvent(EVENT_BONESTORM_4, 7000);
+                    return;
+				//Spin 4
+                case EVENT_BONESTORM_4:
+					if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
+					DoCast(pTarget, SPELL_BONESTORM, 1);
+                    events.ScheduleEvent(EVENT_RESET, 7000);
+                    return;
+				case EVENT_RESET:
+					m_creature->RemoveAurasDueToSpell(SPELL_BONESTORM);
+					events.ScheduleEvent(EVENT_BONESTORM_1, 60000);
+					return;
+				case EVENT_SABERLASH:
+					if (!me->HasAura(SPELL_BONESTORM))
+                    DoCast(me->getVictim(), SPELL_SABERLASH);
+					events.ScheduleEvent(EVENT_SABERLASH, 5000);
+                    return;
+				case EVENT_ENRAGE:
+                    DoCast(me->getVictim(), SPELL_ENRAGE);
+					DoScriptText( SAY_ENRAGE, m_creature);
+					events.ScheduleEvent(EVENT_ENRAGE, 300000);
+                    return;
+			}
+		}
+        DoMeleeAttackIfReady();
+}
+    void JustDied(Unit* killer)  
+    {
+			DoScriptText( SAY_DEATH, m_creature);
+			if (pInstance)
+            pInstance->SetData(DATA_MARROWGAR_EVENT, DONE);
+    }
+};
+
+CreatureAI* GetAI_boss_Marrowgar(Creature* pCreature)
+{
+    return new boss_MarrowgarAI (pCreature);
+}
+
+void AddSC_boss_Marrowgar()
+{
+    Script *newscript;
+    newscript = new Script;
+    newscript->Name="boss_Marrowgar";
+    newscript->GetAI = &GetAI_boss_Marrowgar;
+    newscript->RegisterSelf();
+}
\ No newline at end of file
diff -r 4642400c2daa src/scripts/northrend/Icecrown_Citadel/citadel_transporter.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/scripts/northrend/Icecrown_Citadel/citadel_transporter.cpp	Sat Feb 20 21:00:13 2010 +0200
@@ -0,0 +1,116 @@
+/* Copyright (C) 2006 - 2010 TrinityCore <https://www.trinitycore.org/>
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "ScriptedPch.h"
+#include "instance_icecrown_citadel.h"
+
+#define LIGHTS_HAMMER 70781
+#define ORATORY       70856
+#define RAMPART       70857
+#define DEATHBRINGER  70858
+#define PLAGUEWORKS   9995
+#define CRIMSONHALL   9996
+//#define FWHALLS     9997
+//#define SINDRAGOSA  70861
+//#define LICHKING    70860
+
+/* Unknown coords
+4356.928223 2769.409912 355.955109 - The spire? - 70859
+4199.350098, 2769.421387, 350.977295 - Lich King?
+*/
+
+/* Dont know if this is right, but we're going
+Lights Hammer auto-unlocked
+Kill Marrowgar opens Lady Deathwhisper
+Kill LD unlocks Rampart of Skulls and Saurfang(since the Gunship Battle doesnt work we'll skip it)
+Killing Saurfang opens Crimson Halls and Plagueworks
+Killing Putricide & Blood-Queen Lana'thel opens Frostwing Halls
+Killing Sindragosa opens the Lich King's Lair
+*/
+
+bool GoHello_icecrown_teleporter( Player *pPlayer, GameObject *pGO )
+{
+    ScriptedInstance *pInstance = (ScriptedInstance *) pGO->GetInstanceData();
+    if(!pInstance) return true;
+
+    pPlayer->ADD_GOSSIP_ITEM(0, "Teleport to Light's Hammer", GOSSIP_SENDER_MAIN, LIGHTS_HAMMER);
+    if(pInstance->GetData(DATA_MARROWGAR_EVENT) == DONE || pPlayer->isGameMaster())
+    {
+        pPlayer->ADD_GOSSIP_ITEM(0, "Teleport to the Oratory of the Damned", GOSSIP_SENDER_MAIN, ORATORY);
+        if(pInstance->GetData(DATA_DEATHWHISPER_EVENT) == DONE || pPlayer->isGameMaster())
+        {
+            pPlayer->ADD_GOSSIP_ITEM(0, "Teleport to the Rampart of Skulls", GOSSIP_SENDER_MAIN, RAMPART);
+            pPlayer->ADD_GOSSIP_ITEM(0, "Teleport to Deathbringer's Rise", GOSSIP_SENDER_MAIN, DEATHBRINGER);
+            if(pInstance->GetData(DATA_SAURFANG_EVENT) == DONE || pPlayer->isGameMaster())
+            {
+                pPlayer->ADD_GOSSIP_ITEM(0, "Teleport to the Plagueworks", GOSSIP_SENDER_MAIN, PLAGUEWORKS);
+                    pPlayer->ADD_GOSSIP_ITEM(0, "Teleport to the Crimson Halls", GOSSIP_SENDER_MAIN, CRIMSONHALL);
+            }
+        }
+    }
+    pPlayer->SEND_GOSSIP_MENU(DEFAULT_GOSSIP_MESSAGE, pGO->GetGUID());
+
+    return true;
+}
+
+bool GOSelect_icecrown_teleporter( Player *pPlayer, GameObject *pGO, uint32 sender, uint32 action )
+{
+    if(sender != GOSSIP_SENDER_MAIN) return true;
+    if(!pPlayer->getAttackers().empty()) return true;
+
+    switch(action)
+    {
+    case LIGHTS_HAMMER:
+        pPlayer->TeleportTo(631, -17.071068, 2211.468750, 30.054554, 3.12149);
+        pPlayer->CLOSE_GOSSIP_MENU(); break;
+    case ORATORY:
+        pPlayer->TeleportTo(631, -503.593414, 2211.468750, 62.762070, 3.139313);
+        pPlayer->CLOSE_GOSSIP_MENU(); break;
+    case RAMPART:
+        pPlayer->TeleportTo(631, -615.146118, 2211.471924, 199.908508, 6.26832);
+        pPlayer->CLOSE_GOSSIP_MENU(); break;
+    case DEATHBRINGER:
+        pPlayer->TeleportTo(631, -549.073486, 2211.289307, 539.223450, 6.275452);
+        pPlayer->CLOSE_GOSSIP_MENU(); break;
+    case PLAGUEWORKS:
+        pPlayer->TeleportTo(631, 4357.033691, 2864.192627, 439.336090, 1.583007);
+        pPlayer->CLOSE_GOSSIP_MENU(); break;
+    case CRIMSONHALL:
+        pPlayer->TeleportTo(631, 4452.79785, 2769.291504, 349.350342, 0.023817);
+        pPlayer->CLOSE_GOSSIP_MENU(); break;/*
+    case FWHALLS:
+        pPlayer->TeleportTo(631, x, y, z, orientation);
+        pPlayer->CLOSE_GOSSIP_MENU(); break;
+    case SINDRAGOSA:
+        pPlayer->TeleportTo(631, 4356.581543, 2565.748291, 220.401520, 4.886216);
+        pPlayer->CLOSE_GOSSIP_MENU(); break;
+    case LICHKING:
+        pPlayer->TeleportTo(631, x, y, z, orientation);
+        pPlayer->CLOSE_GOSSIP_MENU(); break;*/
+    }
+
+    return true;
+}
+
+void AddSC_icecrown_teleporter()
+{
+    Script *newscript;
+    newscript = new Script;
+    newscript->Name = "icecrown_teleporter";
+    newscript->pGOHello = &GoHello_icecrown_teleporter;
+    newscript->pGOSelect = &GOSelect_icecrown_teleporter;
+    newscript->RegisterSelf();
+}
diff -r 4642400c2daa src/scripts/northrend/Icecrown_Citadel/instance_icecrown_citadel.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/scripts/northrend/Icecrown_Citadel/instance_icecrown_citadel.cpp	Sat Feb 20 21:00:13 2010 +0200
@@ -0,0 +1,276 @@
+/* Copyright (C) 2006 - 2010 TrinityCore <https://www.trinitycore.org/>
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "ScriptedPch.h"
+#include "instance_icecrown_citadel.h"
+
+#define MAX_ENCOUNTER     4
+
+struct instance_icecrown_citadel : public ScriptedInstance
+{
+    instance_icecrown_citadel(Map* pMap) : ScriptedInstance(pMap) {Initialize();};
+
+	std::string str_data;
+
+	uint64 m_uiMarrowgar;
+    uint64 m_uiDeathwhisper;
+    uint64 m_uiGunship;
+    uint64 m_uiDeathbringer;
+
+	uint64 uiMarrowgarDoor;
+	uint64 uiOratoryDoor;
+	uint64 uiExitDoor;
+	uint64 uiIceblock1;
+	uint64 uiIceblock2;
+
+    uint32 m_auiEncounter[MAX_ENCOUNTER];
+
+   void Initialize()
+   {
+        memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
+
+	    uiMarrowgarDoor = 0;
+        uiOratoryDoor = 0;
+        uiExitDoor = 0;
+		uiIceblock1 = 0;
+		uiIceblock2 = 0;
+
+        m_uiMarrowgar = 0;
+        m_uiDeathwhisper = 0;
+        m_uiGunship = 0;
+        m_uiDeathbringer = 0;
+    }
+
+    bool IsEncounterInProgress() const
+    {
+        for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
+            if (m_auiEncounter[i] == IN_PROGRESS) return true;
+
+        return false;
+    }
+
+    void OnCreatureCreate(Creature* pCreature, bool add)
+    {
+        Map::PlayerList const &players = instance->GetPlayers();
+        uint32 TeamInInstance = 0;
+
+        if (!players.isEmpty())
+        {
+            if (Player* pPlayer = players.begin()->getSource())
+                TeamInInstance = pPlayer->GetTeam();
+        }
+
+        switch(pCreature->GetEntry())
+        {
+			case 36612: 
+				m_uiMarrowgar = pCreature->GetGUID(); 
+            break;
+			case 36855: 
+				m_uiDeathwhisper = pCreature->GetGUID(); 
+            break;
+			case 30343: 
+				m_uiGunship = pCreature->GetGUID(); 
+            break;
+			case 37813: 
+				m_uiDeathbringer = pCreature->GetGUID(); 
+			break;
+            case NPC_SAURFANG:
+                if (TeamInInstance == ALLIANCE)
+                   pCreature->UpdateEntry(NPC_MURADIN, ALLIANCE);
+			break;
+			case NPC_KORKRONGUARD:
+				if (TeamInInstance == ALLIANCE)
+					pCreature->UpdateEntry(NPC_ALLIANCEGUARD, ALLIANCE);
+			break;
+			case NPC_VENDOR_SHAMAN_H:
+				if (TeamInInstance == ALLIANCE)
+					pCreature->UpdateEntry(NPC_VENDOR_SHAMAN_A, ALLIANCE);
+			break;
+			case NPC_VENDOR_MAGE_H:
+				if (TeamInInstance == ALLIANCE)
+					pCreature->UpdateEntry(NPC_VENDOR_MAGE_A, ALLIANCE);
+			break;
+			case NPC_VENDOR_DRUID_H:
+				if (TeamInInstance == ALLIANCE)
+					pCreature->UpdateEntry(NPC_VENDOR_DRUID_A, ALLIANCE);
+			break;
+			case NPC_VENDOR_ROGUE_H:
+				if (TeamInInstance == ALLIANCE)
+					pCreature->UpdateEntry(NPC_VENDOR_ROGUE_A, ALLIANCE);
+			break;
+			case NPC_VENDOR_WARLOCK_H:
+				if (TeamInInstance == ALLIANCE)
+					pCreature->UpdateEntry(NPC_VENDOR_WARLOCK_A, ALLIANCE);
+			break;
+			case NPC_VENDOR_HUNTER_H:
+				if (TeamInInstance == ALLIANCE)
+					pCreature->UpdateEntry(NPC_VENDOR_HUNTER_A, ALLIANCE);
+			break;
+
+        }
+    }
+
+	void OnGameObjectCreate(GameObject* pGo, bool add)
+    {
+        switch(pGo->GetEntry())
+        {
+            case GO_ORATORY_ENTRANCE:
+                uiOratoryDoor = pGo->GetGUID();
+                break;
+            case GO_MARROWGAR_DOOR:
+                uiMarrowgarDoor = pGo->GetGUID();
+            if (m_auiEncounter[0] == IN_PROGRESS) HandleGameObject(NULL,false,pGo);
+            if (m_auiEncounter[0] == DONE || m_auiEncounter[0] == FAIL || m_auiEncounter[0] == NOT_STARTED) HandleGameObject(NULL,true,pGo);
+                break;
+            case GO_ICECROWN_EXIT:
+                uiExitDoor = pGo->GetGUID();
+                break;
+            case GO_ICEBLOCK_1:
+                uiIceblock1 = pGo->GetGUID();
+                if (m_auiEncounter[0] == DONE) HandleGameObject(NULL,true,pGo);
+                break;
+            case GO_ICEBLOCK_2:
+                uiIceblock2 = pGo->GetGUID();
+                if (m_auiEncounter[0] == DONE) HandleGameObject(NULL,true,pGo);
+                break;
+        }
+        if (GameObject* pOratoryDoor = instance->GetGameObject(uiOratoryDoor))
+                    pOratoryDoor->SetGoState(GO_STATE_ACTIVE);
+        if (GameObject* pMarrowgarDoor = instance->GetGameObject(uiMarrowgarDoor))
+                    pMarrowgarDoor->SetGoState(GO_STATE_ACTIVE);
+        if (GameObject* pExitDoor = instance->GetGameObject(uiExitDoor))
+                    pExitDoor->SetGoState(GO_STATE_ACTIVE);
+	}
+
+    void SetData(uint32 type, uint32 data)
+    {
+
+        switch(type)
+        {
+            case DATA_MARROWGAR_EVENT:
+                m_auiEncounter[0] = data;
+                if (data == DONE)
+                    HandleGameObject(uiIceblock1,true);
+                if (data == DONE)
+                    HandleGameObject(uiIceblock2,true);
+                if (data == IN_PROGRESS)
+                    HandleGameObject(uiMarrowgarDoor,false);
+                if (data == DONE || data == FAIL || data == NOT_STARTED)
+                    HandleGameObject(uiMarrowgarDoor,true);
+                break;
+            case DATA_DEATHWHISPER_EVENT:
+                m_auiEncounter[0] = data;
+                break;
+            case DATA_GUNSHIP_EVENT:
+                m_auiEncounter[0] = data;
+                break;
+            case DATA_SAURFANG_EVENT:
+                m_auiEncounter[0] = data;
+                break;
+        }
+
+        if (data == DONE)
+        {
+            SaveToDB();
+        }
+    }
+
+    uint32 GetData(uint32 type)
+    {
+        switch(type)
+        {
+            case DATA_MARROWGAR_EVENT:			 return m_auiEncounter[0];
+            case DATA_DEATHWHISPER_EVENT:        return m_auiEncounter[1];
+            case DATA_GUNSHIP_EVENT:             return m_auiEncounter[2];
+            case DATA_SAURFANG_EVENT:            return m_auiEncounter[3];
+        }
+
+        return 0;
+    }
+
+    uint64 GetData64(uint32 identifier)
+    {
+        switch(identifier)
+        {
+            case NPC_MARROWGAR:                    return m_uiMarrowgar;
+            case NPC_DEATHWHISPER:                 return m_uiDeathwhisper;
+            case NPC_GUNSHIP_A:                    return m_uiGunship;
+            case NPC_DEATHBRINGER_SAURFANG:        return m_uiDeathbringer;
+        }
+
+        return 0;
+    }
+
+    std::string GetSaveData()
+    {
+        OUT_SAVE_INST_DATA;
+
+        std::ostringstream saveStream;
+        saveStream << "I C " << m_auiEncounter[0] << " " << m_auiEncounter[1] << " "
+            << m_auiEncounter[2] << " " << m_auiEncounter[3];
+
+        str_data = saveStream.str();
+
+        OUT_SAVE_INST_DATA_COMPLETE;
+        return str_data;
+    }
+
+    void Load(const char* in)
+    {
+        if (!in)
+        {
+            OUT_LOAD_INST_DATA_FAIL;
+            return;
+        }
+
+        OUT_LOAD_INST_DATA(in);
+
+        char dataHead1, dataHead2;
+        uint16 data0, data1, data2, data3;
+
+        std::istringstream loadStream(in);
+        loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3;
+
+        if (dataHead1 == 'I' && dataHead2 == 'C')
+        {
+            m_auiEncounter[0] = data0;
+            m_auiEncounter[1] = data1;
+            m_auiEncounter[2] = data2;
+            m_auiEncounter[3] = data3;
+
+            for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
+                if (m_auiEncounter[i] == IN_PROGRESS)
+                    m_auiEncounter[i] = NOT_STARTED;
+
+        } else OUT_LOAD_INST_DATA_FAIL;
+
+        OUT_LOAD_INST_DATA_COMPLETE;
+    }
+};
+
+InstanceData* GetInstanceData_instance_icecrown_citadel(Map* pMap)
+{
+   return new instance_icecrown_citadel(pMap);
+}
+
+void AddSC_instance_icecrown_citadel()
+{
+   Script *newscript;
+   newscript = new Script;
+   newscript->Name = "instance_icecrown_citadel";
+   newscript->GetInstanceData = &GetInstanceData_instance_icecrown_citadel;
+   newscript->RegisterSelf();
+}
diff -r 4642400c2daa src/scripts/northrend/Icecrown_Citadel/instance_icecrown_citadel.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/scripts/northrend/Icecrown_Citadel/instance_icecrown_citadel.h	Sat Feb 20 21:00:13 2010 +0200
@@ -0,0 +1,72 @@
+#ifndef DEF_ICECROWN_CITADEL_H
+#define DEF_ICECROWN_CITADEL_H
+
+// Lights Hammer Faction Leader
+#define NPC_SAURFANG                37187
+#define NPC_MURADIN                 37200
+#define NPC_ALLIANCEGUARD           37190
+#define NPC_KORKRONGUARD            37189
+
+// Light's Hammer Vendors
+#define NPC_VENDOR_SHAMAN_H         38841
+#define NPC_VENDOR_SHAMAN_A         38840
+#define NPC_VENDOR_MAGE_H           38284
+#define NPC_VENDOR_MAGE_A           38283
+#define NPC_VENDOR_DRUID_H          37992
+#define NPC_VENDOR_DRUID_A          37999
+#define NPC_VENDOR_ROGUE_H          37991
+#define NPC_VENDOR_ROGUE_A          37997
+#define NPC_VENDOR_WARLOCK_H        38181
+#define NPC_VENDOR_WARLOCK_A        38182
+#define NPC_VENDOR_HUNTER_H         37993
+#define NPC_VENDOR_HUNTER_A         37998
+
+// Bosses
+#define NPC_MARROWGAR              36612
+#define NPC_DEATHWHISPER           36855
+#define NPC_GUNSHIP_H              30342
+#define NPC_GUNSHIP_A              30343
+#define NPC_DEATHBRINGER_SAURFANG  37813
+#define NPC_ROTFACE                36627
+#define NPC_FESTERGUT              36626
+#define NPC_PUTRICIDE              36678
+#define NPC_KELESETH               37972
+#define NPC_TALADRAM               37973
+#define NPC_VALANAR                37970
+#define NPC_LANATHEL               37955
+#define NPC_VALITRIHA              36789
+#define NPC_SINDRAGOSA             37755
+#define NPC_LICHKING               29983
+
+// Doors
+#define GO_ORATORY_ENTRANCE      201563
+#define GO_MARROWGAR_DOOR        201857
+#define GO_ICECROWN_EXIT         201583
+#define GO_ICEBLOCK_1            201910
+#define GO_ICEBLOCK_2            201911
+
+// Deathwhisper Adds
+#define NPC_CULT_ADHERENT        37949
+#define NPC_CULT_FANATIC         37890
+#define NPC_VENGEFUL_SHADE       38222
+
+enum fights
+{
+DATA_MARROWGAR_EVENT           = 1,
+DATA_DEATHWHISPER_EVENT        = 2,
+DATA_GUNSHIP_EVENT             = 3,
+DATA_SAURFANG_EVENT            = 4,
+DATA_FESTERGUT_EVENT           = 5,
+DATA_ROTFACE_EVENT             = 6,
+DATA_PUTRICIDE_EVENT           = 7,
+DATA_KELESETH_EVENT            = 8,
+DATA_TALADRAM_EVENT            = 9,
+DATA_VALANAR_EVENT             = 10,
+DATA_BLOODPRINCE_EVENT         = 11,
+DATA_LANATHEL_EVENT            = 12,
+DATA_DREAMWALKER_EVENT         = 13,
+DATA_SINDRAGOSA_EVENT          = 14,
+DATA_LICHKING_EVENT            = 15
+};
+
+#endif
\ No newline at end of file
