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
+ * 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
+ * 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
+ * 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
+ * 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
+ * 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
+ * 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
+ * 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