aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/2013_08_27_01_world_instance_template.sql1
-rw-r--r--src/server/game/Scripting/ScriptLoader.cpp91
-rw-r--r--src/server/scripts/Northrend/CMakeLists.txt6
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp462
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp381
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp493
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp436
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp287
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h80
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp (renamed from src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_pinnacle.cpp)0
-rw-r--r--src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp14
11 files changed, 1080 insertions, 1171 deletions
diff --git a/sql/updates/world/2013_08_27_01_world_instance_template.sql b/sql/updates/world/2013_08_27_01_world_instance_template.sql
new file mode 100644
index 00000000000..75000549464
--- /dev/null
+++ b/sql/updates/world/2013_08_27_01_world_instance_template.sql
@@ -0,0 +1 @@
+UPDATE `instance_template` SET `script`='instance_vault_of_archavon' WHERE `map`=624;
diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp
index 513cfe74b6a..426d83ef837 100644
--- a/src/server/game/Scripting/ScriptLoader.cpp
+++ b/src/server/game/Scripting/ScriptLoader.cpp
@@ -372,23 +372,36 @@ void AddSC_thunder_bluff();
void AddSC_ungoro_crater();
void AddSC_winterspring();
-//northrend
+// Northrend
+
void AddSC_boss_slad_ran();
void AddSC_boss_moorabi();
void AddSC_boss_drakkari_colossus();
void AddSC_boss_gal_darah();
void AddSC_boss_eck();
void AddSC_instance_gundrak();
-void AddSC_boss_krik_thir(); //Azjol-Nerub
+
+// Azjol-Nerub - Azjol-Nerub
+void AddSC_boss_krik_thir();
void AddSC_boss_hadronox();
void AddSC_boss_anub_arak();
void AddSC_instance_azjol_nerub();
-void AddSC_instance_ahnkahet(); //Azjol-Nerub Ahn'kahet
-void AddSC_boss_amanitar();
+
+// Azjol-Nerub - Ahn'kahet
+void AddSC_boss_elder_nadox();
void AddSC_boss_taldaram();
+void AddSC_boss_amanitar();
void AddSC_boss_jedoga_shadowseeker();
-void AddSC_boss_elder_nadox();
void AddSC_boss_volazj();
+void AddSC_instance_ahnkahet();
+
+// Drak'Tharon Keep
+void AddSC_boss_trollgore();
+void AddSC_boss_novos();
+void AddSC_boss_king_dred();
+void AddSC_boss_tharon_ja();
+void AddSC_instance_drak_tharon_keep();
+
void AddSC_boss_argent_challenge(); //Trial of the Champion
void AddSC_boss_black_knight();
void AddSC_boss_grand_champions();
@@ -457,26 +470,28 @@ void AddSC_boss_freya();
void AddSC_boss_yogg_saron();
void AddSC_boss_algalon_the_observer();
void AddSC_instance_ulduar();
-void AddSC_boss_keleseth(); //Utgarde Keep
+
+// Utgarde Keep - Utgarde Keep
+void AddSC_boss_keleseth();
void AddSC_boss_skarvald_dalronn();
void AddSC_boss_ingvar_the_plunderer();
void AddSC_instance_utgarde_keep();
-void AddSC_boss_svala(); //Utgarde pinnacle
+void AddSC_utgarde_keep();
+
+// Utgarde Keep - Utgarde Pinnacle
+void AddSC_boss_svala();
void AddSC_boss_palehoof();
void AddSC_boss_skadi();
void AddSC_boss_ymiron();
void AddSC_instance_utgarde_pinnacle();
-void AddSC_utgarde_keep();
-void AddSC_boss_archavon(); //Vault of Archavon
+
+// Vault of Archavon
+void AddSC_boss_archavon();
void AddSC_boss_emalon();
void AddSC_boss_koralon();
void AddSC_boss_toravon();
-void AddSC_instance_archavon();
-void AddSC_boss_trollgore(); //Drak'Tharon Keep
-void AddSC_boss_novos();
-void AddSC_boss_king_dred();
-void AddSC_boss_tharon_ja();
-void AddSC_instance_drak_tharon_keep();
+void AddSC_instance_vault_of_archavon();
+
void AddSC_boss_cyanigosa(); //Violet Hold
void AddSC_boss_erekem();
void AddSC_boss_ichoron();
@@ -1163,12 +1178,28 @@ void AddNorthrendScripts()
AddSC_boss_gal_darah();
AddSC_boss_eck();
AddSC_instance_gundrak();
- AddSC_boss_amanitar();
- AddSC_boss_taldaram(); //Azjol-Nerub Ahn'kahet
+
+ // Azjol-Nerub - Ahn'kahet
AddSC_boss_elder_nadox();
+ AddSC_boss_taldaram();
+ AddSC_boss_amanitar();
AddSC_boss_jedoga_shadowseeker();
AddSC_boss_volazj();
AddSC_instance_ahnkahet();
+
+ // Azjol-Nerub - Azjol-Nerub
+ AddSC_boss_krik_thir();
+ AddSC_boss_hadronox();
+ AddSC_boss_anub_arak();
+ AddSC_instance_azjol_nerub();
+
+ // Drak'Tharon Keep
+ AddSC_boss_trollgore();
+ AddSC_boss_novos();
+ AddSC_boss_king_dred();
+ AddSC_boss_tharon_ja();
+ AddSC_instance_drak_tharon_keep();
+
AddSC_boss_argent_challenge(); //Trial of the Champion
AddSC_boss_black_knight();
AddSC_boss_grand_champions();
@@ -1181,10 +1212,6 @@ void AddNorthrendScripts()
AddSC_boss_twin_valkyr();
AddSC_boss_northrend_beasts();
AddSC_instance_trial_of_the_crusader();
- AddSC_boss_krik_thir(); //Azjol-Nerub Azjol-Nerub
- AddSC_boss_hadronox();
- AddSC_boss_anub_arak();
- AddSC_instance_azjol_nerub();
AddSC_boss_anubrekhan(); //Naxxramas
AddSC_boss_maexxna();
AddSC_boss_patchwerk();
@@ -1241,26 +1268,28 @@ void AddNorthrendScripts()
AddSC_boss_yogg_saron();
AddSC_boss_algalon_the_observer();
AddSC_instance_ulduar();
- AddSC_boss_keleseth(); //Utgarde Keep
+
+ // Utgarde Keep - Utgarde Keep
+ AddSC_boss_keleseth();
AddSC_boss_skarvald_dalronn();
AddSC_boss_ingvar_the_plunderer();
AddSC_instance_utgarde_keep();
- AddSC_boss_svala(); //Utgarde pinnacle
+ AddSC_utgarde_keep();
+
+ // Utgarde Keep - Utgarde Pinnacle
+ AddSC_boss_svala();
AddSC_boss_palehoof();
AddSC_boss_skadi();
AddSC_boss_ymiron();
AddSC_instance_utgarde_pinnacle();
- AddSC_utgarde_keep();
- AddSC_boss_archavon(); //Vault of Archavon
+
+ // Vault of Archavon
+ AddSC_boss_archavon();
AddSC_boss_emalon();
AddSC_boss_koralon();
AddSC_boss_toravon();
- AddSC_instance_archavon();
- AddSC_boss_trollgore(); //Drak'Tharon Keep
- AddSC_boss_novos();
- AddSC_boss_king_dred();
- AddSC_boss_tharon_ja();
- AddSC_instance_drak_tharon_keep();
+ AddSC_instance_vault_of_archavon();
+
AddSC_boss_cyanigosa(); //Violet Hold
AddSC_boss_erekem();
AddSC_boss_ichoron();
diff --git a/src/server/scripts/Northrend/CMakeLists.txt b/src/server/scripts/Northrend/CMakeLists.txt
index e04a4c43479..3c56361d096 100644
--- a/src/server/scripts/Northrend/CMakeLists.txt
+++ b/src/server/scripts/Northrend/CMakeLists.txt
@@ -125,11 +125,11 @@ set(scripts_STAT_SRCS
Northrend/VaultOfArchavon/boss_emalon.cpp
Northrend/VaultOfArchavon/boss_toravon.cpp
Northrend/zone_sholazar_basin.cpp
- Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
- Northrend/UtgardeKeep/UtgardePinnacle/instance_pinnacle.cpp
- Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp
+ Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp
Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp
+ Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp
+ Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp
Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h
Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
index 3dd84c62890..1ec33fcb301 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
@@ -57,7 +57,10 @@ enum Events
EVENT_WOE_STRIKE,
EVENT_SHADOW_AXE,
EVENT_JUST_TRANSFORMED,
- EVENT_SUMMON_BANSHEE
+ EVENT_SUMMON_BANSHEE,
+
+ EVENT_RESURRECT_1,
+ EVENT_RESURRECT_2
};
enum Phases
@@ -95,295 +98,277 @@ enum Spells
class boss_ingvar_the_plunderer : public CreatureScript
{
-public:
- boss_ingvar_the_plunderer() : CreatureScript("boss_ingvar_the_plunderer") { }
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_ingvar_the_plundererAI(creature);
- }
-
- struct boss_ingvar_the_plundererAI : public ScriptedAI
- {
- boss_ingvar_the_plundererAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = creature->GetInstanceScript();
- bIsUndead = false;
- }
-
- InstanceScript* instance;
+ public:
+ boss_ingvar_the_plunderer() : CreatureScript("boss_ingvar_the_plunderer") { }
- bool bIsUndead;
-
- void Reset() OVERRIDE
+ struct boss_ingvar_the_plundererAI : public BossAI
{
- if (bIsUndead)
- me->UpdateEntry(NPC_INGVAR_HUMAN);
+ boss_ingvar_the_plundererAI(Creature* creature) : BossAI(creature, DATA_INGVAR)
+ {
+ _isUndead = false;
+ }
- bIsUndead = false;
+ void Reset() OVERRIDE
+ {
+ if (_isUndead)
+ me->UpdateEntry(NPC_INGVAR_HUMAN);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
- me->SetStandState(UNIT_STAND_STATE_STAND);
+ _isUndead = false;
- events.Reset();
- events.SetPhase(PHASE_HUMAN);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
+ me->SetStandState(UNIT_STAND_STATE_STAND);
- events.ScheduleEvent(EVENT_CLEAVE, urand(6, 12)*IN_MILLISECONDS, 0, PHASE_HUMAN);
- events.ScheduleEvent(EVENT_STAGGERING_ROAR, urand(18, 21)*IN_MILLISECONDS, 0, PHASE_HUMAN);
- events.ScheduleEvent(EVENT_ENRAGE, urand(7, 14)*IN_MILLISECONDS, 0, PHASE_HUMAN);
- events.ScheduleEvent(EVENT_SMASH, urand(12, 17)*IN_MILLISECONDS, 0, PHASE_HUMAN);
+ _Reset();
+ events.SetPhase(PHASE_HUMAN);
- if (instance)
- instance->SetData(DATA_INGVAR_EVENT, NOT_STARTED);
- }
-
- void DamageTaken(Unit* /*done_by*/, uint32 &damage) OVERRIDE
- {
- if (damage >= me->GetHealth() && !bIsUndead)
- {
- //DoCast(me, SPELL_INGVAR_FEIGN_DEATH, true); // Dont work ???
- // visuel hack
- me->SetHealth(0);
- me->InterruptNonMeleeSpells(true);
- me->RemoveAllAuras();
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- me->GetMotionMaster()->MovementExpired(false);
- me->GetMotionMaster()->MoveIdle();
- me->SetStandState(UNIT_STAND_STATE_DEAD);
- // visuel hack end
-
- events.SetPhase(PHASE_EVENT);
- events.ScheduleEvent(EVENT_SUMMON_BANSHEE, 3 * IN_MILLISECONDS, 0, PHASE_EVENT);
-
- Talk(YELL_DEAD_1);
+ events.ScheduleEvent(EVENT_CLEAVE, urand(6, 12)*IN_MILLISECONDS, 0, PHASE_HUMAN);
+ events.ScheduleEvent(EVENT_STAGGERING_ROAR, urand(18, 21)*IN_MILLISECONDS, 0, PHASE_HUMAN);
+ events.ScheduleEvent(EVENT_ENRAGE, urand(7, 14)*IN_MILLISECONDS, 0, PHASE_HUMAN);
+ events.ScheduleEvent(EVENT_SMASH, urand(12, 17)*IN_MILLISECONDS, 0, PHASE_HUMAN);
}
- if (events.IsInPhase(PHASE_EVENT))
- damage = 0;
- }
-
- void StartZombiePhase()
- {
- bIsUndead = true;
- me->UpdateEntry(NPC_INGVAR_UNDEAD);
- events.ScheduleEvent(EVENT_JUST_TRANSFORMED, 2 * IN_MILLISECONDS, 0, PHASE_EVENT);
+ void DamageTaken(Unit* /*doneBy*/, uint32& damage) OVERRIDE
+ {
+ if (damage >= me->GetHealth() && !_isUndead)
+ {
+ //DoCast(me, SPELL_INGVAR_FEIGN_DEATH, true); // Dont work ???
+ // visuel hack
+ me->SetHealth(0);
+ me->InterruptNonMeleeSpells(true);
+ me->RemoveAllAuras();
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ me->GetMotionMaster()->MovementExpired(false);
+ me->GetMotionMaster()->MoveIdle();
+ me->SetStandState(UNIT_STAND_STATE_DEAD);
+ // visuel hack end
+
+ events.SetPhase(PHASE_EVENT);
+ events.ScheduleEvent(EVENT_SUMMON_BANSHEE, 3 * IN_MILLISECONDS, 0, PHASE_EVENT);
+
+ Talk(YELL_DEAD_1);
+ }
- Talk(YELL_AGGRO_2);
- }
+ if (events.IsInPhase(PHASE_EVENT))
+ damage = 0;
+ }
- void EnterCombat(Unit* /*who*/) OVERRIDE
- {
- if (!bIsUndead)
- Talk(YELL_AGGRO_1);
+ void StartZombiePhase()
+ {
+ _isUndead = true;
+ me->UpdateEntry(NPC_INGVAR_UNDEAD);
+ events.ScheduleEvent(EVENT_JUST_TRANSFORMED, 2 * IN_MILLISECONDS, 0, PHASE_EVENT);
- if (instance)
- instance->SetData(DATA_INGVAR_EVENT, IN_PROGRESS);
+ Talk(YELL_AGGRO_2);
+ }
- me->SetInCombatWithZone();
- }
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ _EnterCombat();
- void JustDied(Unit* /*killer*/) OVERRIDE
- {
- Talk(YELL_DEAD_2);
+ if (!_isUndead)
+ Talk(YELL_AGGRO_1);
+ }
- if (instance)
+ void JustDied(Unit* /*killer*/) OVERRIDE
{
+ _JustDied();
+ Talk(YELL_DEAD_2);
+
// Ingvar has NPC_INGVAR_UNDEAD id in this moment, so we have to update encounter state for his original id
instance->UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, NPC_INGVAR_HUMAN, me);
- instance->SetData(DATA_INGVAR_EVENT, DONE);
}
- }
- void ScheduleSecondPhase()
- {
- events.SetPhase(PHASE_UNDEAD);
- events.ScheduleEvent(EVENT_DARK_SMASH, urand(14, 18)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
- events.ScheduleEvent(EVENT_DREADFUL_ROAR, urand(18, 22)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
- events.ScheduleEvent(EVENT_WOE_STRIKE, urand(10, 14)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
- events.ScheduleEvent(EVENT_SHADOW_AXE, 30*IN_MILLISECONDS, 0, PHASE_UNDEAD);
- }
+ void ScheduleSecondPhase()
+ {
+ events.SetPhase(PHASE_UNDEAD);
+ events.ScheduleEvent(EVENT_DARK_SMASH, urand(14, 18)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
+ events.ScheduleEvent(EVENT_DREADFUL_ROAR, urand(18, 22)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
+ events.ScheduleEvent(EVENT_WOE_STRIKE, urand(10, 14)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
+ events.ScheduleEvent(EVENT_SHADOW_AXE, 30*IN_MILLISECONDS, 0, PHASE_UNDEAD);
+ }
- void KilledUnit(Unit* /*victim*/) OVERRIDE
- {
- Talk(bIsUndead ? YELL_KILL_1 : YELL_KILL_2);
- }
+ void KilledUnit(Unit* /*victim*/) OVERRIDE
+ {
+ Talk(_isUndead ? YELL_KILL_1 : YELL_KILL_2);
+ }
- void UpdateAI(uint32 diff) OVERRIDE
- {
- if (!UpdateVictim() && !events.IsInPhase(PHASE_EVENT))
- return;
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!UpdateVictim() && !events.IsInPhase(PHASE_EVENT))
+ return;
- events.Update(diff);
+ events.Update(diff);
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
+ while (uint32 eventId = events.ExecuteEvent())
{
- // PHASE ONE
- case EVENT_CLEAVE:
- DoCastVictim(SPELL_CLEAVE);
- events.ScheduleEvent(EVENT_CLEAVE, urand(6, 12)*IN_MILLISECONDS, 0, PHASE_HUMAN);
- break;
- case EVENT_STAGGERING_ROAR:
- DoCast(me, SPELL_STAGGERING_ROAR);
- events.ScheduleEvent(EVENT_STAGGERING_ROAR, urand(18, 22)*IN_MILLISECONDS, 0, PHASE_HUMAN);
- break;
- case EVENT_ENRAGE:
- DoCast(me, SPELL_ENRAGE);
- events.ScheduleEvent(EVENT_ENRAGE, urand(7, 14)*IN_MILLISECONDS, 0, PHASE_HUMAN);
- break;
- case EVENT_SMASH:
- DoCastAOE(SPELL_SMASH);
- events.ScheduleEvent(EVENT_SMASH, urand(12, 16)*IN_MILLISECONDS, 0, PHASE_HUMAN);
- break;
- case EVENT_JUST_TRANSFORMED:
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- me->SetInCombatWithZone();
- me->GetMotionMaster()->MoveChase(me->GetVictim());
- ScheduleSecondPhase();
- return;
- case EVENT_SUMMON_BANSHEE:
- DoCast(me, SPELL_SUMMON_BANSHEE);
- return;
- // PHASE TWO
- case EVENT_DARK_SMASH:
- DoCastVictim(SPELL_DARK_SMASH);
- events.ScheduleEvent(EVENT_DARK_SMASH, urand(12, 16)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
- break;
- case EVENT_DREADFUL_ROAR:
- DoCast(me, SPELL_DREADFUL_ROAR);
- events.ScheduleEvent(EVENT_DREADFUL_ROAR, urand(18, 22)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
- break;
- case EVENT_WOE_STRIKE:
- DoCastVictim(SPELL_WOE_STRIKE);
- events.ScheduleEvent(EVENT_WOE_STRIKE, urand(10, 14)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
- break;
- case EVENT_SHADOW_AXE:
- if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1))
- {
- DoCast(target, SPELL_SHADOW_AXE_SUMMON);
- }
- events.ScheduleEvent(EVENT_SHADOW_AXE, 30*IN_MILLISECONDS, 0, PHASE_UNDEAD);
- break;
+ switch (eventId)
+ {
+ // PHASE ONE
+ case EVENT_CLEAVE:
+ DoCastVictim(SPELL_CLEAVE);
+ events.ScheduleEvent(EVENT_CLEAVE, urand(6, 12)*IN_MILLISECONDS, 0, PHASE_HUMAN);
+ break;
+ case EVENT_STAGGERING_ROAR:
+ DoCast(me, SPELL_STAGGERING_ROAR);
+ events.ScheduleEvent(EVENT_STAGGERING_ROAR, urand(18, 22)*IN_MILLISECONDS, 0, PHASE_HUMAN);
+ break;
+ case EVENT_ENRAGE:
+ DoCast(me, SPELL_ENRAGE);
+ events.ScheduleEvent(EVENT_ENRAGE, urand(7, 14)*IN_MILLISECONDS, 0, PHASE_HUMAN);
+ break;
+ case EVENT_SMASH:
+ DoCastAOE(SPELL_SMASH);
+ events.ScheduleEvent(EVENT_SMASH, urand(12, 16)*IN_MILLISECONDS, 0, PHASE_HUMAN);
+ break;
+ case EVENT_JUST_TRANSFORMED:
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ me->SetInCombatWithZone();
+ me->GetMotionMaster()->MoveChase(me->GetVictim());
+ ScheduleSecondPhase();
+ return;
+ case EVENT_SUMMON_BANSHEE:
+ DoCast(me, SPELL_SUMMON_BANSHEE);
+ return;
+ // PHASE TWO
+ case EVENT_DARK_SMASH:
+ DoCastVictim(SPELL_DARK_SMASH);
+ events.ScheduleEvent(EVENT_DARK_SMASH, urand(12, 16)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
+ break;
+ case EVENT_DREADFUL_ROAR:
+ DoCast(me, SPELL_DREADFUL_ROAR);
+ events.ScheduleEvent(EVENT_DREADFUL_ROAR, urand(18, 22)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
+ break;
+ case EVENT_WOE_STRIKE:
+ DoCastVictim(SPELL_WOE_STRIKE);
+ events.ScheduleEvent(EVENT_WOE_STRIKE, urand(10, 14)*IN_MILLISECONDS, 0, PHASE_UNDEAD);
+ break;
+ case EVENT_SHADOW_AXE:
+ if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1))
+ DoCast(target, SPELL_SHADOW_AXE_SUMMON);
+
+ events.ScheduleEvent(EVENT_SHADOW_AXE, 30*IN_MILLISECONDS, 0, PHASE_UNDEAD);
+ break;
+ }
}
+
+ DoMeleeAttackIfReady();
}
- DoMeleeAttackIfReady();
- }
- private:
- EventMap events;
- };
+ private:
+ bool _isUndead;
+ };
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetUtgardeKeepAI<boss_ingvar_the_plundererAI>(creature);
+ }
};
-
class npc_annhylde_the_caller : public CreatureScript
{
-public:
- npc_annhylde_the_caller() : CreatureScript("npc_annhylde_the_caller") { }
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_annhylde_the_callerAI(creature);
- }
+ public:
+ npc_annhylde_the_caller() : CreatureScript("npc_annhylde_the_caller") { }
- struct npc_annhylde_the_callerAI : public ScriptedAI
- {
- npc_annhylde_the_callerAI(Creature* creature) : ScriptedAI(creature)
+ struct npc_annhylde_the_callerAI : public ScriptedAI
{
- instance = creature->GetInstanceScript();
- }
+ npc_annhylde_the_callerAI(Creature* creature) : ScriptedAI(creature)
+ {
+ _instance = creature->GetInstanceScript();
+ }
- float x, y, z;
- InstanceScript* instance;
- uint32 uiResurectTimer;
- uint32 uiResurectPhase;
+ void Reset() OVERRIDE
+ {
+ _events.Reset();
- void Reset() OVERRIDE
- {
- //! HACK: Creature's can't have MOVEMENTFLAG_FLYING
- me->SetHover(true);
+ //! HACK: Creature's can't have MOVEMENTFLAG_FLYING
+ me->SetHover(true);
- me->GetPosition(x, y, z);
- DoTeleportTo(x+1, y, z+30);
+ me->GetPosition(x, y, z);
+ DoTeleportTo(x+1, y, z+30);
- Unit* ingvar = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_INGVAR) : 0);
- if (ingvar)
- {
- me->GetMotionMaster()->MovePoint(1, x, y, z+15);
+ if (Creature* ingvar = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_INGVAR)))
+ {
+ me->GetMotionMaster()->MovePoint(1, x, y, z+15);
- // Talk(YELL_RESSURECT);
+ // Talk(YELL_RESSURECT);
+ }
}
- }
- void MovementInform(uint32 type, uint32 id) OVERRIDE
- {
- if (type != POINT_MOTION_TYPE)
- return;
- Unit* ingvar = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_INGVAR) : 0);
- if (ingvar)
+ void MovementInform(uint32 type, uint32 id) OVERRIDE
{
- switch (id)
+ if (type != POINT_MOTION_TYPE)
+ return;
+
+ if (Creature* ingvar = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_INGVAR)))
{
- case 1:
- ingvar->RemoveAura(SPELL_SUMMON_BANSHEE);
- ingvar->CastSpell(ingvar, SPELL_SCOURG_RESURRECTION_DUMMY, true);
- DoCast(ingvar, SPELL_SCOURG_RESURRECTION_BEAM);
- uiResurectTimer = 8000;
- uiResurectPhase = 1;
- break;
- case 2:
- me->SetVisible(false);
- me->DealDamage(me, me->GetHealth());
- me->RemoveCorpse();
- break;
+ switch (id)
+ {
+ case 1:
+ ingvar->RemoveAura(SPELL_SUMMON_BANSHEE);
+ ingvar->CastSpell(ingvar, SPELL_SCOURG_RESURRECTION_DUMMY, true);
+ DoCast(ingvar, SPELL_SCOURG_RESURRECTION_BEAM);
+ _events.ScheduleEvent(EVENT_RESURRECT_1, 8000);
+ break;
+ case 2:
+ me->DespawnOrUnsummon();
+ break;
+ default:
+ break;
+ }
}
}
- }
- void AttackStart(Unit* /*who*/) OVERRIDE {}
- void MoveInLineOfSight(Unit* /*who*/) OVERRIDE {}
+ void AttackStart(Unit* /*who*/) OVERRIDE { }
+ void MoveInLineOfSight(Unit* /*who*/) OVERRIDE { }
+ void EnterCombat(Unit* /*who*/) OVERRIDE { }
- void EnterCombat(Unit* /*who*/) OVERRIDE {}
- void UpdateAI(uint32 diff) OVERRIDE
- {
- if (uiResurectTimer)
+ void UpdateAI(uint32 diff) OVERRIDE
{
- if (uiResurectTimer <= diff)
+ _events.Update(diff);
+
+ while (uint32 eventId = _events.ExecuteEvent())
{
- if (uiResurectPhase == 1)
- {
- Unit* ingvar = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_INGVAR) : 0);
- if (ingvar)
- {
- ingvar->SetStandState(UNIT_STAND_STATE_STAND);
- ingvar->CastSpell(ingvar, SPELL_SCOURG_RESURRECTION_HEAL, false);
- }
- uiResurectTimer = 3000;
- uiResurectPhase = 2;
- }
- else if (uiResurectPhase == 2)
+ switch (eventId)
{
- if (Creature* ingvar = Unit::GetCreature(*me, instance ? instance->GetData64(DATA_INGVAR) : 0))
- {
- ingvar->RemoveAurasDueToSpell(SPELL_SCOURG_RESURRECTION_DUMMY);
-
- if (ingvar->GetVictim())
- if (boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI* ai = CAST_AI(boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI, ingvar->AI()))
- ai->StartZombiePhase();
-
- me->GetMotionMaster()->MovePoint(2, x+1, y, z+30);
- ++uiResurectPhase;
- uiResurectTimer = 0;
- }
+ case EVENT_RESURRECT_1:
+ if (Creature* ingvar = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_INGVAR)))
+ {
+ ingvar->SetStandState(UNIT_STAND_STATE_STAND);
+ ingvar->CastSpell(ingvar, SPELL_SCOURG_RESURRECTION_HEAL, false);
+ }
+ _events.ScheduleEvent(EVENT_RESURRECT_2, 3000);
+ break;
+ case EVENT_RESURRECT_2:
+ if (Creature* ingvar = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_INGVAR)))
+ {
+ ingvar->RemoveAurasDueToSpell(SPELL_SCOURG_RESURRECTION_DUMMY);
+
+ if (ingvar->GetVictim())
+ if (boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI* ai = CAST_AI(boss_ingvar_the_plunderer::boss_ingvar_the_plundererAI, ingvar->AI()))
+ ai->StartZombiePhase();
+
+ me->GetMotionMaster()->MovePoint(2, x+1, y, z+30);
+ }
+ break;
+ default:
+ break;
}
- } else uiResurectTimer -= diff;
+ }
}
+
+ private:
+ InstanceScript* _instance;
+ EventMap _events;
+ float x, y, z;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetUtgardeKeepAI<npc_annhylde_the_callerAI>(creature);
}
- };
};
enum ShadowAxe
@@ -428,12 +413,7 @@ public:
{
DoCast(me, SPELL_SHADOW_AXE_DAMAGE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
- if (TempSummon* summon = me->ToTempSummon())
- {
- summon->UnSummon(10000);
- }
- else
- me->DisappearAndDie();
+ me->DespawnOrUnsummon(10000);
}
}
};
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp
index 6c7bf6afbe0..b46a41af678 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp
@@ -75,268 +75,247 @@ float AttackLoc[3]= {197.636f, 194.046f, 40.8164f};
class npc_frost_tomb : public CreatureScript
{
-public:
- npc_frost_tomb() : CreatureScript("npc_frost_tomb") {}
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_frost_tombAI(creature);
- }
+ public:
+ npc_frost_tomb() : CreatureScript("npc_frost_tomb") { }
- struct npc_frost_tombAI : public ScriptedAI
- {
- npc_frost_tombAI(Creature* creature) : ScriptedAI(creature)
+ struct npc_frost_tombAI : public ScriptedAI
{
- if (me->IsSummon())
- if (Unit* summon = me->ToTempSummon()->GetSummoner())
- DoCast(summon, SPELL_FROST_TOMB, true);
+ npc_frost_tombAI(Creature* creature) : ScriptedAI(creature)
+ {
+ _instance = creature->GetInstanceScript();
+ }
- instance = creature->GetInstanceScript();
- }
+ void IsSummonedBy(Unit* summoner) OVERRIDE
+ {
+ DoCast(summoner, SPELL_FROST_TOMB, true);
+ }
+
+ void UpdateAI(uint32 /*diff*/) OVERRIDE { }
+
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ if (Creature* keleseth = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_PRINCE_KELESETH)))
+ keleseth->AI()->SetData(DATA_ON_THE_ROCKS, false);
+ }
- void UpdateAI(uint32 /*diff*/) OVERRIDE {}
+ private:
+ InstanceScript* _instance;
+ };
- void JustDied(Unit* /*killer*/) OVERRIDE
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- if (instance)
- if (Unit* boss = me->GetUnit(*me, instance->GetData64(DATA_PRINCEKELESETH)))
- if (boss->ToCreature() && boss->ToCreature()->AI())
- boss->ToCreature()->AI()->SetData(DATA_ON_THE_ROCKS, false);
+ return GetUtgardeKeepAI<npc_frost_tombAI>(creature);
}
-
- private:
- InstanceScript* instance;
- };
};
class boss_keleseth : public CreatureScript
{
-public:
- boss_keleseth() : CreatureScript("boss_keleseth") {}
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_kelesethAI(creature);
- }
-
- struct boss_kelesethAI : public BossAI
- {
- boss_kelesethAI(Creature* creature) : BossAI(creature, DATA_PRINCEKELESETH_EVENT){}
+ public:
+ boss_keleseth() : CreatureScript("boss_keleseth") { }
- void Reset() OVERRIDE
+ struct boss_kelesethAI : public BossAI
{
- if (instance)
- instance->SetData(DATA_PRINCEKELESETH_EVENT, NOT_STARTED);
-
- events.Reset();
- events.ScheduleEvent(EVENT_SHADOWBOLT, urand(2, 3)*IN_MILLISECONDS);
- events.ScheduleEvent(EVENT_FROST_TOMB, urand(14, 19)*IN_MILLISECONDS);
- events.ScheduleEvent(EVENT_SUMMON_SKELETONS, 6*IN_MILLISECONDS);
+ boss_kelesethAI(Creature* creature) : BossAI(creature, DATA_PRINCE_KELESETH) { }
- summons.DespawnAll();
+ void Reset() OVERRIDE
+ {
+ _Reset();
+ events.ScheduleEvent(EVENT_SHADOWBOLT, urand(2, 3)*IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_FROST_TOMB, urand(14, 19)*IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_SUMMON_SKELETONS, 6*IN_MILLISECONDS);
- onTheRocks = true;
- }
+ onTheRocks = true;
+ }
- void EnterCombat(Unit* who) OVERRIDE
- {
- me->SetInCombatWithZone();
- if (instance)
- instance->SetData(DATA_PRINCEKELESETH_EVENT, IN_PROGRESS);
- Talk(SAY_START_COMBAT);
+ void EnterCombat(Unit* who) OVERRIDE
+ {
+ _EnterCombat();
+ Talk(SAY_START_COMBAT);
- if (!who)
- return;
+ if (!who)
+ return;
- std::list<Creature*> runemages;
- me->GetCreatureListWithEntryInGrid(runemages, NPC_RUNEMAGE, 60.0f);
- if (!runemages.empty())
- {
- for (std::list<Creature*>::iterator itr = runemages.begin(); itr != runemages.end(); ++itr)
+ std::list<Creature*> guards;
+ me->GetCreatureListWithEntryInGrid(guards, NPC_RUNEMAGE, 60.0f);
+ me->GetCreatureListWithEntryInGrid(guards, NPC_STRATEGIST, 60.0f);
+ if (!guards.empty())
{
- if ((*itr)->IsAlive() && (*itr)->IsWithinLOSInMap(me))
- (*itr)->AI()->AttackStart(who);
+ for (std::list<Creature*>::iterator itr = guards.begin(); itr != guards.end(); ++itr)
+ {
+ if ((*itr)->IsAlive() && (*itr)->IsWithinLOSInMap(me))
+ (*itr)->AI()->AttackStart(who);
+ }
}
}
- std::list<Creature*> strategists;
- me->GetCreatureListWithEntryInGrid(strategists, NPC_STRATEGIST, 60.0f);
- if (!strategists.empty())
+ void JustDied(Unit* /*killer*/) OVERRIDE
{
- for (std::list<Creature*>::iterator itr = strategists.begin(); itr != strategists.end(); ++itr)
- {
- if ((*itr)->IsAlive() && (*itr)->IsWithinLOSInMap(me))
- (*itr)->AI()->AttackStart(who);
- }
+ _JustDied();
+ Talk(SAY_DEATH);
}
- }
-
- void JustDied(Unit* /*killer*/) OVERRIDE
- {
- if (instance)
- instance->SetData(DATA_PRINCEKELESETH_EVENT, DONE);
- summons.DespawnAll();
- Talk(SAY_DEATH);
- }
- void SetData(uint32 data, uint32 value) OVERRIDE
- {
- if (data == DATA_ON_THE_ROCKS)
- onTheRocks = value;
- }
+ void SetData(uint32 data, uint32 value) OVERRIDE
+ {
+ if (data == DATA_ON_THE_ROCKS)
+ onTheRocks = value;
+ }
- uint32 GetData(uint32 data) const OVERRIDE
- {
- if (data == DATA_ON_THE_ROCKS)
- return onTheRocks;
+ uint32 GetData(uint32 data) const OVERRIDE
+ {
+ if (data == DATA_ON_THE_ROCKS)
+ return onTheRocks;
- return 0;
- }
+ return 0;
+ }
- void UpdateAI(uint32 diff) OVERRIDE
- {
- if (!UpdateVictim())
- return;
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!UpdateVictim())
+ return;
- events.Update(diff);
+ events.Update(diff);
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
+ while (uint32 eventId = events.ExecuteEvent())
{
- case EVENT_SUMMON_SKELETONS:
- Talk(SAY_SUMMON_SKELETONS);
- SummonSkeletons();
- break;
- case EVENT_SHADOWBOLT:
- DoCastVictim(SPELL_SHADOWBOLT);
- events.ScheduleEvent(EVENT_SHADOWBOLT, urand(2, 3)*IN_MILLISECONDS);
- break;
- case EVENT_FROST_TOMB:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true, -SPELL_FROST_TOMB))
+ switch (eventId)
{
- Talk(SAY_FROST_TOMB);
- Talk(SAY_FROST_TOMB_EMOTE, target->GetGUID());
+ case EVENT_SUMMON_SKELETONS:
+ Talk(SAY_SUMMON_SKELETONS);
+ SummonSkeletons();
+ break;
+ case EVENT_SHADOWBOLT:
+ DoCastVictim(SPELL_SHADOWBOLT);
+ events.ScheduleEvent(EVENT_SHADOWBOLT, urand(2, 3) * IN_MILLISECONDS);
+ break;
+ case EVENT_FROST_TOMB:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true, -SPELL_FROST_TOMB))
+ {
+ Talk(SAY_FROST_TOMB);
+ Talk(SAY_FROST_TOMB_EMOTE, target->GetGUID());
- DoCast(target, SPELL_FROST_TOMB_STUN, true);
- // checked from sniffs - the player casts the spell
- target->CastSpell(target, SPELL_FROST_TOMB_SUMMON, true);
+ DoCast(target, SPELL_FROST_TOMB_STUN, true);
+ // checked from sniffs - the player casts the spell
+ target->CastSpell(target, SPELL_FROST_TOMB_SUMMON, true);
+ }
+ events.ScheduleEvent(EVENT_FROST_TOMB, urand(14, 19) * IN_MILLISECONDS);
+ break;
+ default:
+ break;
}
- events.ScheduleEvent(EVENT_FROST_TOMB, urand(14, 19)*IN_MILLISECONDS);
- break;
}
+
+ DoMeleeAttackIfReady();
}
- DoMeleeAttackIfReady();
- }
+ void SummonSkeletons()
+ {
+ // I could not found any spell casted for this
+ for (uint8 i = 0; i < 4; ++i)
+ me->SummonCreature(NPC_SKELETON, SkeletonSpawnPoint[0][0], SkeletonSpawnPoint[0][1], SKELETONSPAWN_Z, 0);
+ }
+
+ private:
+ bool onTheRocks;
+ };
- void SummonSkeletons()
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- // I could not found any spell casted for this
- for (uint8 i = 0; i < 4; ++i)
- me->SummonCreature(NPC_SKELETON, SkeletonSpawnPoint[0][0], SkeletonSpawnPoint[0][1], SKELETONSPAWN_Z, 0);
+ return GetUtgardeKeepAI<boss_kelesethAI>(creature);
}
- private:
- bool onTheRocks;
- };
};
class npc_vrykul_skeleton : public CreatureScript
{
-public:
- npc_vrykul_skeleton() : CreatureScript("npc_vrykul_skeleton") {}
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_vrykul_skeletonAI(creature);
- }
-
- struct npc_vrykul_skeletonAI : public ScriptedAI
- {
- npc_vrykul_skeletonAI(Creature* creature) : ScriptedAI(creature) {}
+ public:
+ npc_vrykul_skeleton() : CreatureScript("npc_vrykul_skeleton") { }
- void Reset() OVERRIDE
+ struct npc_vrykul_skeletonAI : public ScriptedAI
{
- events.Reset();
- events.ScheduleEvent(EVENT_DECREPIFY, urand(4, 6)*IN_MILLISECONDS);
-
- }
+ npc_vrykul_skeletonAI(Creature* creature) : ScriptedAI(creature) { }
- void DamageTaken(Unit* /*done_by*/, uint32 &damage) OVERRIDE
- {
- if (damage >= me->GetHealth())
+ void Reset() OVERRIDE
{
- damage = 0;
+ events.Reset();
+ events.ScheduleEvent(EVENT_DECREPIFY, urand(4, 6) * IN_MILLISECONDS);
+ }
- // There are some issues with pets
- // they will still attack. I would say it is a PetAI bug
- if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
+ void DamageTaken(Unit* /*doneBy*/, uint32& damage) OVERRIDE
+ {
+ if (damage >= me->GetHealth())
{
- // from sniffs
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- me->SetFlag(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD);
+ damage = 0;
- events.Reset();
- events.ScheduleEvent(EVENT_RESURRECT, urand(18, 22)*IN_MILLISECONDS);
+ // There are some issues with pets
+ // they will still attack. I would say it is a PetAI bug
+ if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
+ {
+ // from sniffs
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ me->SetFlag(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD);
+
+ events.Reset();
+ events.ScheduleEvent(EVENT_RESURRECT, urand(18, 22) * IN_MILLISECONDS);
- me->GetMotionMaster()->MovementExpired(false);
- me->GetMotionMaster()->MoveIdle();
+ me->GetMotionMaster()->MovementExpired(false);
+ me->GetMotionMaster()->MoveIdle();
+ }
}
}
- }
- void UpdateAI(uint32 diff) OVERRIDE
- {
- if (!UpdateVictim())
- return;
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!UpdateVictim())
+ return;
- events.Update(diff);
+ events.Update(diff);
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
+ while (uint32 eventId = events.ExecuteEvent())
{
- case EVENT_DECREPIFY:
- DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_DECREPIFY), SPELL_DECREPIFY);
- events.ScheduleEvent(EVENT_DECREPIFY, urand(1, 5)*IN_MILLISECONDS);
- break;
- case EVENT_RESURRECT:
- events.ScheduleEvent(EVENT_FULL_HEAL, 1*IN_MILLISECONDS);
- events.ScheduleEvent(EVENT_SHADOW_FISSURE, 1*IN_MILLISECONDS);
- break;
- case EVENT_FULL_HEAL:
- DoCast(me, SPELL_FULL_HEAL, true);
- break;
- case EVENT_SHADOW_FISSURE:
- DoCast(me, SPELL_SHADOW_FISSURE, true);
- if (TempSummon* temp = me->ToTempSummon())
- {
- if (Unit* summoner = temp->GetSummoner())
- {
- DoCast(summoner, SPELL_BONE_ARMOR);
- }
- }
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- me->RemoveFlag(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD);
- me->GetMotionMaster()->MoveChase(me->GetVictim());
- events.ScheduleEvent(EVENT_DECREPIFY, urand(4, 6)*IN_MILLISECONDS);
- break;
+ switch (eventId)
+ {
+ case EVENT_DECREPIFY:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_DECREPIFY))
+ DoCast(target, SPELL_DECREPIFY);
+ events.ScheduleEvent(EVENT_DECREPIFY, urand(1, 5)*IN_MILLISECONDS);
+ break;
+ case EVENT_RESURRECT:
+ events.ScheduleEvent(EVENT_FULL_HEAL, 1 * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_SHADOW_FISSURE, 1 * IN_MILLISECONDS);
+ break;
+ case EVENT_FULL_HEAL:
+ DoCast(me, SPELL_FULL_HEAL, true);
+ break;
+ case EVENT_SHADOW_FISSURE:
+ DoCast(me, SPELL_SHADOW_FISSURE, true);
+ DoCastAOE(SPELL_BONE_ARMOR, true);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ me->RemoveFlag(UNIT_FIELD_BYTES_1, UNIT_STAND_STATE_DEAD);
+ me->GetMotionMaster()->MoveChase(me->GetVictim());
+ events.ScheduleEvent(EVENT_DECREPIFY, urand(4, 6) * IN_MILLISECONDS);
+ break;
+ default:
+ break;
+ }
}
+
+ if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
+ DoMeleeAttackIfReady();
}
- if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
- DoMeleeAttackIfReady();
- }
+ private:
+ EventMap events;
+ };
- private:
- EventMap events;
- };
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetUtgardeKeepAI<npc_vrykul_skeletonAI>(creature);
+ }
};
class spell_frost_tomb : public SpellScriptLoader
@@ -347,12 +326,14 @@ class spell_frost_tomb : public SpellScriptLoader
class spell_frost_tomb_AuraScript : public AuraScript
{
PrepareAuraScript(spell_frost_tomb_AuraScript);
+
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEATH)
if (Unit* caster = GetCaster())
- if (caster->ToCreature() && caster->IsAlive())
- caster->ToCreature()->DespawnOrUnsummon(1000);
+ if (caster->IsAlive())
+ if (Creature* creature = caster->ToCreature())
+ creature->DespawnOrUnsummon(1000);
}
void Register() OVERRIDE
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp
index bbb3d666b32..ffdd8fe232f 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp
@@ -58,14 +58,6 @@ enum Spells
SPELL_SUMMON_DALRONN_GHOST = 48612,
};
-enum Creatures
-{
- NPC_SKARVALD_THE_CONSTRUCTOR = 24200,
- NPC_SKARVALD_GHOST = 27390,
- NPC_DALRONN_THE_CONTROLLER = 24201,
- NPC_DALRONN_GHOST = 27389
-};
-
class SkarvaldChargePredicate
{
public:
@@ -82,355 +74,334 @@ class SkarvaldChargePredicate
class boss_skarvald_the_constructor : public CreatureScript
{
-public:
- boss_skarvald_the_constructor() : CreatureScript("boss_skarvald_the_constructor") { }
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_skarvald_the_constructorAI(creature);
- }
+ public:
+ boss_skarvald_the_constructor() : CreatureScript("boss_skarvald_the_constructor") { }
- struct boss_skarvald_the_constructorAI : public ScriptedAI
- {
- boss_skarvald_the_constructorAI(Creature* creature) : ScriptedAI(creature)
+ struct boss_skarvald_the_constructorAI : public BossAI
{
- instance = creature->GetInstanceScript();
- }
+ boss_skarvald_the_constructorAI(Creature* creature) : BossAI(creature, DATA_SKARVALD_DALRONN) { }
- InstanceScript* instance;
+ bool ghost;
+ uint32 Charge_Timer;
+ uint32 StoneStrike_Timer;
+ uint32 Response_Timer;
+ uint32 Check_Timer;
+ bool Dalronn_isDead;
+ bool Enraged;
- bool ghost;
- uint32 Charge_Timer;
- uint32 StoneStrike_Timer;
- uint32 Response_Timer;
- uint32 Check_Timer;
- bool Dalronn_isDead;
- bool Enraged;
-
- void Reset() OVERRIDE
- {
- Charge_Timer = 5000;
- StoneStrike_Timer = 10000;
- Dalronn_isDead = false;
- Response_Timer = 0;
- Check_Timer = 5000;
- Enraged = false;
-
- ghost = (me->GetEntry() == NPC_SKARVALD_GHOST);
- if (!ghost && instance)
+ void Reset() OVERRIDE
{
- Unit* dalronn = Unit::GetUnit(*me, instance->GetData64(DATA_DALRONN));
- if (dalronn && dalronn->isDead())
- dalronn->ToCreature()->Respawn();
-
- instance->SetData(DATA_SKARVALD_DALRONN_EVENT, NOT_STARTED);
+ Charge_Timer = 5000;
+ StoneStrike_Timer = 10000;
+ Dalronn_isDead = false;
+ Response_Timer = 0;
+ Check_Timer = 5000;
+ Enraged = false;
+
+ ghost = me->GetEntry() == NPC_SKARVALD_GHOST;
+ if (!ghost)
+ _Reset();
}
- }
- void EnterCombat(Unit* who) OVERRIDE
- {
- if (!ghost && instance)
+ void EnterCombat(Unit* /*who*/) OVERRIDE
{
- Talk(YELL_SKARVALD_AGGRO);
-
- Unit* dalronn = Unit::GetUnit(*me, instance->GetData64(DATA_DALRONN));
- if (dalronn && dalronn->IsAlive() && !dalronn->GetVictim())
- dalronn->getThreatManager().addThreat(who, 0.0f);
+ if (!ghost)
+ {
+ _EnterCombat();
+ Talk(YELL_SKARVALD_AGGRO);
+ }
+ }
- instance->SetData(DATA_SKARVALD_DALRONN_EVENT, IN_PROGRESS);
+ void DamageTaken(Unit* /*attacker*/, uint32& damage) OVERRIDE
+ {
+ if (!Enraged && !ghost && me->HealthBelowPctDamaged(15, damage))
+ {
+ Enraged = true;
+ DoCast(me, SPELL_ENRAGE);
+ }
}
- }
- void DamageTaken(Unit* /*attacker*/, uint32& damage) OVERRIDE
- {
- if (!Enraged && !ghost && me->HealthBelowPctDamaged(15, damage))
+ void DoAction(int32 /*actionId*/)
{
- Enraged = true;
- DoCast(me, SPELL_ENRAGE);
+ summons.DespawnAll();
}
- }
- void JustDied(Unit* killer) OVERRIDE
- {
- if (!ghost && instance)
+ void JustDied(Unit* killer) OVERRIDE
{
- Unit* dalronn = Unit::GetUnit(*me, instance->GetData64(DATA_DALRONN));
- if (dalronn)
+ if (!ghost)
{
- if (dalronn->isDead())
+ if (Creature* dalronn = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALRONN)))
{
- Talk(YELL_SKARVALD_DAL_DIED);
+ if (dalronn->IsAlive())
+ {
+ Talk(YELL_SKARVALD_SKA_DIEDFIRST);
- instance->SetData(DATA_SKARVALD_DALRONN_EVENT, DONE);
- }
- else
- {
- Talk(YELL_SKARVALD_SKA_DIEDFIRST);
+ me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
- me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
- //DoCast(me, SPELL_SUMMON_SKARVALD_GHOST, true);
- Creature* temp = me->SummonCreature(NPC_SKARVALD_GHOST, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_CORPSE_DESPAWN, 5000);
- if (temp)
+ //DoCast(me, SPELL_SUMMON_SKARVALD_GHOST, true);
+ if (Creature* temp = me->SummonCreature(NPC_SKARVALD_GHOST, *me, TEMPSUMMON_CORPSE_DESPAWN, 5000))
+ {
+ temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ temp->AI()->AttackStart(killer);
+ }
+ }
+ else
{
- temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- temp->AI()->AttackStart(killer);
+ dalronn->AI()->DoAction(0);
+ _JustDied();
+ Talk(YELL_SKARVALD_DAL_DIED);
}
}
}
}
- }
- void KilledUnit(Unit* /*victim*/) OVERRIDE
- {
- if (!ghost)
+ void KilledUnit(Unit* who) OVERRIDE
{
- Talk(YELL_SKARVALD_KILL);
+ if (!ghost && who->GetTypeId() == TYPEID_PLAYER)
+ Talk(YELL_SKARVALD_KILL);
}
- }
- void UpdateAI(uint32 diff) OVERRIDE
- {
- if (ghost)
+ void UpdateAI(uint32 diff) OVERRIDE
{
- if (instance && instance->GetData(DATA_SKARVALD_DALRONN_EVENT) != IN_PROGRESS)
- me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
- }
-
- if (!UpdateVictim())
- return;
+ if (!UpdateVictim())
+ return;
- if (!ghost)
- {
- if (Check_Timer)
+ if (!ghost)
{
- if (Check_Timer <= diff)
+ if (Check_Timer)
{
- Check_Timer = 5000;
- Unit* dalronn = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_DALRONN) : 0);
- if (dalronn && dalronn->isDead())
+ if (Check_Timer <= diff)
{
- Dalronn_isDead = true;
- Response_Timer = 2000;
- Check_Timer = 0;
+ Check_Timer = 5000;
+ Creature* dalronn = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALRONN));
+ if (dalronn && dalronn->isDead())
+ {
+ Dalronn_isDead = true;
+ Response_Timer = 2000;
+ Check_Timer = 0;
+ }
}
- } else Check_Timer -= diff;
- }
- if (Response_Timer && Dalronn_isDead)
- {
- if (Response_Timer <= diff)
+ else
+ Check_Timer -= diff;
+ }
+ if (Response_Timer && Dalronn_isDead)
{
- Talk(YELL_SKARVALD_DAL_DIEDFIRST);
+ if (Response_Timer <= diff)
+ {
+ Talk(YELL_SKARVALD_DAL_DIEDFIRST);
- Response_Timer = 0;
- } else Response_Timer -= diff;
+ Response_Timer = 0;
+ }
+ else
+ Response_Timer -= diff;
+ }
}
- }
- if (Charge_Timer <= diff)
- {
- DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, SkarvaldChargePredicate(me)), SPELL_CHARGE);
- Charge_Timer = 5000+rand()%5000;
- } else Charge_Timer -= diff;
+ if (Charge_Timer <= diff)
+ {
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, SkarvaldChargePredicate(me)))
+ DoCast(target, SPELL_CHARGE);
+ Charge_Timer = 5000+rand()%5000;
+ }
+ else
+ Charge_Timer -= diff;
- if (StoneStrike_Timer <= diff)
- {
- DoCastVictim(SPELL_STONE_STRIKE);
- StoneStrike_Timer = 5000+rand()%5000;
- } else StoneStrike_Timer -= diff;
+ if (StoneStrike_Timer <= diff)
+ {
+ DoCastVictim(SPELL_STONE_STRIKE);
+ StoneStrike_Timer = 5000+rand()%5000;
+ }
+ else
+ StoneStrike_Timer -= diff;
- if (!me->HasUnitState(UNIT_STATE_CASTING))
- DoMeleeAttackIfReady();
- }
- };
+ if (!me->HasUnitState(UNIT_STATE_CASTING))
+ DoMeleeAttackIfReady();
+ }
+ };
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetUtgardeKeepAI<boss_skarvald_the_constructorAI>(creature);
+ }
};
class boss_dalronn_the_controller : public CreatureScript
{
-public:
- boss_dalronn_the_controller() : CreatureScript("boss_dalronn_the_controller") { }
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new boss_dalronn_the_controllerAI(creature);
- }
+ public:
+ boss_dalronn_the_controller() : CreatureScript("boss_dalronn_the_controller") { }
- struct boss_dalronn_the_controllerAI : public ScriptedAI
- {
- boss_dalronn_the_controllerAI(Creature* creature) : ScriptedAI(creature)
+ struct boss_dalronn_the_controllerAI : public BossAI
{
- instance = creature->GetInstanceScript();
- }
+ boss_dalronn_the_controllerAI(Creature* creature) : BossAI(creature, DATA_SKARVALD_DALRONN) { }
- InstanceScript* instance;
+ bool ghost;
+ uint32 ShadowBolt_Timer;
+ uint32 Debilitate_Timer;
+ uint32 Summon_Timer;
- bool ghost;
- uint32 ShadowBolt_Timer;
- uint32 Debilitate_Timer;
- uint32 Summon_Timer;
+ uint32 Response_Timer;
+ uint32 Check_Timer;
+ uint32 AggroYell_Timer;
+ bool Skarvald_isDead;
- uint32 Response_Timer;
- uint32 Check_Timer;
- uint32 AggroYell_Timer;
- bool Skarvald_isDead;
-
- void Reset() OVERRIDE
- {
- ShadowBolt_Timer = 1000;
- Debilitate_Timer = 5000;
- Summon_Timer = 10000;
- Check_Timer = 5000;
- Skarvald_isDead = false;
- Response_Timer = 0;
- AggroYell_Timer = 0;
-
- ghost = me->GetEntry() == NPC_DALRONN_GHOST;
- if (!ghost && instance)
+ void Reset() OVERRIDE
{
- Unit* skarvald = Unit::GetUnit(*me, instance->GetData64(DATA_SKARVALD));
- if (skarvald && skarvald->isDead())
- skarvald->ToCreature()->Respawn();
-
- instance->SetData(DATA_SKARVALD_DALRONN_EVENT, NOT_STARTED);
+ ShadowBolt_Timer = 1000;
+ Debilitate_Timer = 5000;
+ Summon_Timer = 10000;
+ Check_Timer = 5000;
+ Skarvald_isDead = false;
+ Response_Timer = 0;
+ AggroYell_Timer = 0;
+
+ ghost = me->GetEntry() == NPC_DALRONN_GHOST;
+ if (!ghost)
+ _Reset();
}
- }
- void EnterCombat(Unit* who) OVERRIDE
- {
- if (!ghost && instance)
+ void EnterCombat(Unit* /*who*/) OVERRIDE
{
- Unit* skarvald = Unit::GetUnit(*me, instance->GetData64(DATA_SKARVALD));
- if (skarvald && skarvald->IsAlive() && !skarvald->GetVictim())
- skarvald->getThreatManager().addThreat(who, 0.0f);
-
- AggroYell_Timer = 5000;
+ if (!ghost)
+ {
+ _EnterCombat();
+ AggroYell_Timer = 5000;
+ }
+ }
- if (instance)
- instance->SetData(DATA_SKARVALD_DALRONN_EVENT, IN_PROGRESS);
+ void DoAction(int32 /*actionId*/)
+ {
+ summons.DespawnAll();
}
- }
- void JustDied(Unit* killer) OVERRIDE
- {
- if (!ghost && instance)
+ void JustDied(Unit* killer) OVERRIDE
{
- Unit* skarvald = Unit::GetUnit(*me, instance->GetData64(DATA_SKARVALD));
- if (skarvald)
+ if (!ghost)
{
- if (skarvald->isDead())
+ if (Creature* skarvald = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SKARVALD)))
{
- Talk(YELL_DALRONN_SKA_DIED);
+ if (skarvald->IsAlive())
+ {
+ Talk(YELL_DALRONN_DAL_DIEDFIRST);
- if (instance)
- instance->SetData(DATA_SKARVALD_DALRONN_EVENT, DONE);
- }
- else
- {
- Talk(YELL_DALRONN_DAL_DIEDFIRST);
+ me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
- me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE);
- //DoCast(me, SPELL_SUMMON_DALRONN_GHOST, true);
- Creature* temp = me->SummonCreature(NPC_DALRONN_GHOST, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_CORPSE_DESPAWN, 5000);
- if (temp)
+ //DoCast(me, SPELL_SUMMON_DALRONN_GHOST, true);
+ if (Creature* temp = me->SummonCreature(NPC_DALRONN_GHOST, *me, TEMPSUMMON_CORPSE_DESPAWN, 5000))
+ {
+ temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ temp->AI()->AttackStart(killer);
+ }
+ }
+ else
{
- temp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- temp->AI()->AttackStart(killer);
+ skarvald->AI()->DoAction(0);
+ _JustDied();
+ Talk(YELL_DALRONN_SKA_DIED);
}
}
}
}
- }
- void KilledUnit(Unit* /*victim*/) OVERRIDE
- {
- if (!ghost)
+ void KilledUnit(Unit* who) OVERRIDE
{
- Talk(YELL_DALRONN_KILL);
+ if (!ghost && who->GetTypeId() == TYPEID_PLAYER)
+ Talk(YELL_DALRONN_KILL);
}
- }
- void UpdateAI(uint32 diff) OVERRIDE
- {
- if (ghost)
+ void UpdateAI(uint32 diff) OVERRIDE
{
- if (instance && instance->GetData(DATA_SKARVALD_DALRONN_EVENT) != IN_PROGRESS)
- me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
- }
+ if (!UpdateVictim())
+ return;
- if (!UpdateVictim())
- return;
-
- if (AggroYell_Timer)
- {
- if (AggroYell_Timer <= diff)
+ if (AggroYell_Timer)
{
- Talk(YELL_DALRONN_AGGRO);
+ if (AggroYell_Timer <= diff)
+ {
+ Talk(YELL_DALRONN_AGGRO);
- AggroYell_Timer = 0;
- } else AggroYell_Timer -= diff;
- }
+ AggroYell_Timer = 0;
+ }
+ else
+ AggroYell_Timer -= diff;
+ }
- if (!ghost)
- {
- if (Check_Timer)
+ if (!ghost)
{
- if (Check_Timer <= diff)
+ if (Check_Timer)
{
- Check_Timer = 5000;
- Unit* skarvald = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_SKARVALD) : 0);
- if (skarvald && skarvald->isDead())
+ if (Check_Timer <= diff)
{
- Skarvald_isDead = true;
- Response_Timer = 2000;
- Check_Timer = 0;
+ Check_Timer = 5000;
+ Creature* skarvald = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SKARVALD));
+ if (skarvald && skarvald->isDead())
+ {
+ Skarvald_isDead = true;
+ Response_Timer = 2000;
+ Check_Timer = 0;
+ }
}
- } else Check_Timer -= diff;
- }
+ else
+ Check_Timer -= diff;
+ }
- if (Response_Timer && Skarvald_isDead)
- {
- if (Response_Timer <= diff)
+ if (Response_Timer && Skarvald_isDead)
{
- Talk(YELL_DALRONN_SKA_DIEDFIRST);
- Response_Timer = 0;
- } else Response_Timer -= diff;
+ if (Response_Timer <= diff)
+ {
+ Talk(YELL_DALRONN_SKA_DIEDFIRST);
+ Response_Timer = 0;
+ }
+ else
+ Response_Timer -= diff;
+ }
}
- }
- if (ShadowBolt_Timer <= diff)
- {
- if (!me->IsNonMeleeSpellCasted(false))
+ if (ShadowBolt_Timer <= diff)
{
- DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0), SPELL_SHADOW_BOLT);
- ShadowBolt_Timer = 2100;//give a 100ms pause to try cast other spells
+ if (!me->IsNonMeleeSpellCasted(false))
+ {
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
+ DoCast(target, SPELL_SHADOW_BOLT);
+ ShadowBolt_Timer = 2100;//give a 100ms pause to try cast other spells
+ }
}
- } else ShadowBolt_Timer -= diff;
+ else
+ ShadowBolt_Timer -= diff;
- if (Debilitate_Timer <= diff)
- {
- if (!me->IsNonMeleeSpellCasted(false))
+ if (Debilitate_Timer <= diff)
{
- DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0), SPELL_DEBILITATE);
- Debilitate_Timer = 5000+rand()%5000;
+ if (!me->IsNonMeleeSpellCasted(false))
+ {
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
+ DoCast(target, SPELL_DEBILITATE);
+ Debilitate_Timer = 5000+rand()%5000;
+ }
}
- } else Debilitate_Timer -= diff;
+ else
+ Debilitate_Timer -= diff;
- if (IsHeroic())
- {
- if (Summon_Timer <= diff)
+ if (IsHeroic())
{
- if (!me->IsNonMeleeSpellCasted(false))
+ if (Summon_Timer <= diff)
{
- DoCast(me, H_SPELL_SUMMON_SKELETONS);
- Summon_Timer = (rand()%10000) + 20000;
+ if (!me->IsNonMeleeSpellCasted(false))
+ {
+ DoCast(me, H_SPELL_SUMMON_SKELETONS);
+ Summon_Timer = (rand()%10000) + 20000;
+ }
}
- } else Summon_Timer -= diff;
+ else
+ Summon_Timer -= diff;
+ }
+
+ DoMeleeAttackIfReady();
}
+ };
- DoMeleeAttackIfReady();
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetUtgardeKeepAI<boss_dalronn_the_controllerAI>(creature);
}
- };
-
};
void AddSC_boss_skarvald_dalronn()
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp
index 92857ce06db..7bc25aad773 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp
@@ -15,300 +15,244 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Instance_Utgarde_Keep
-SD%Complete: 90
-SDComment: Instance Data Scripts and functions to acquire mobs and set encounter status for use in various Utgarde Keep Scripts
-SDCategory: Utgarde Keep
-EndScriptData */
-
#include "ScriptMgr.h"
#include "InstanceScript.h"
#include "utgarde_keep.h"
-#include "Player.h"
-
-#define MAX_ENCOUNTER 3
-
-#define ENTRY_BELLOW_1 186688
-#define ENTRY_BELLOW_2 186689
-#define ENTRY_BELLOW_3 186690
-
-#define ENTRY_FORGEFIRE_1 186692
-#define ENTRY_FORGEFIRE_2 186693
-#define ENTRY_FORGEFIRE_3 186691
-
-#define ENTRY_GLOWING_ANVIL_1 186609
-#define ENTRY_GLOWING_ANVIL_2 186610
-#define ENTRY_GLOWING_ANVIL_3 186611
-#define ENTRY_GIANT_PORTCULLIS_1 186756
-#define ENTRY_GIANT_PORTCULLIS_2 186694
+DoorData const doorData[] =
+{
+ { GO_GIANT_PORTCULLIS_1, DATA_INGVAR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { GO_GIANT_PORTCULLIS_2, DATA_INGVAR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
+};
-/* Utgarde Keep encounters:
-0 - Prince Keleseth
-1 - Skarvald Dalronn
-2 - Ingvar the Plunderer
-*/
+MinionData const minionData[] =
+{
+ { NPC_SKARVALD, DATA_SKARVALD_DALRONN },
+ { NPC_DALRONN, DATA_SKARVALD_DALRONN }
+};
class instance_utgarde_keep : public InstanceMapScript
{
-public:
- instance_utgarde_keep() : InstanceMapScript("instance_utgarde_keep", 574) { }
-
- InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
- {
- return new instance_utgarde_keep_InstanceMapScript(map);
- }
+ public:
+ instance_utgarde_keep() : InstanceMapScript(UKScriptName, 574) { }
- struct instance_utgarde_keep_InstanceMapScript : public InstanceScript
- {
- instance_utgarde_keep_InstanceMapScript(Map* map) : InstanceScript(map) {}
-
- uint64 Keleseth;
- uint64 Skarvald;
- uint64 Dalronn;
- uint64 Ingvar;
-
- uint64 forge_bellow[3];
- uint64 forge_fire[3];
- uint64 forge_anvil[3];
- uint64 portcullis[2];
-
- uint32 m_auiEncounter[MAX_ENCOUNTER];
- uint32 forge_event[3];
- std::string str_data;
-
- void Initialize() OVERRIDE
- {
- memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
-
- Keleseth = 0;
- Skarvald = 0;
- Dalronn = 0;
- Ingvar = 0;
-
- for (uint8 i = 0; i < 3; ++i)
+ struct instance_utgarde_keep_InstanceMapScript : public InstanceScript
+ {
+ instance_utgarde_keep_InstanceMapScript(Map* map) : InstanceScript(map)
{
- forge_bellow[i] = 0;
- forge_fire[i] = 0;
- forge_anvil[i] = 0;
- forge_event[i] = NOT_STARTED;
+ SetBossNumber(EncounterCount);
+ LoadDoorData(doorData);
+ LoadMinionData(minionData);
+
+ PrinceKelesethGUID = 0;
+ SkarvaldGUID = 0;
+ DalronnGUID = 0;
+ IngvarGUID = 0;
}
- portcullis[0] = 0;
- portcullis[1] = 0;
- }
-
- bool IsEncounterInProgress() const OVERRIDE
- {
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (m_auiEncounter[i] == IN_PROGRESS)
- return true;
-
- return false;
- }
-
- Player* GetPlayerInMap()
- {
- Map::PlayerList const& players = instance->GetPlayers();
-
- if (!players.isEmpty())
+ void OnCreatureCreate(Creature* creature) OVERRIDE
{
- for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
+ switch (creature->GetEntry())
{
- if (Player* player = itr->GetSource())
- return player;
+ case NPC_PRINCE_KELESETH:
+ PrinceKelesethGUID = creature->GetGUID();
+ break;
+ case NPC_SKARVALD:
+ SkarvaldGUID = creature->GetGUID();
+ AddMinion(creature, true);
+ break;
+ case NPC_DALRONN:
+ DalronnGUID = creature->GetGUID();
+ AddMinion(creature, true);
+ break;
+ case NPC_INGVAR:
+ IngvarGUID = creature->GetGUID();
+ break;
+ default:
+ break;
}
}
- TC_LOG_DEBUG(LOG_FILTER_TSCR, "Instance Utgarde Keep: GetPlayerInMap, but PlayerList is empty!");
- return NULL;
- }
-
- void OnCreatureCreate(Creature* creature) OVERRIDE
- {
- switch (creature->GetEntry())
+ void OnCreatureRemove(Creature* creature) OVERRIDE
{
- case 23953: Keleseth = creature->GetGUID(); break;
- case 24201: Dalronn = creature->GetGUID(); break;
- case 24200: Skarvald = creature->GetGUID(); break;
- case 23954: Ingvar = creature->GetGUID(); break;
+ switch (creature->GetEntry())
+ {
+ case NPC_SKARVALD:
+ case NPC_DALRONN:
+ AddMinion(creature, false);
+ break;
+ default:
+ break;
+ }
}
- }
- void OnGameObjectCreate(GameObject* go) OVERRIDE
- {
- switch (go->GetEntry())
+ void OnGameObjectCreate(GameObject* go) OVERRIDE
{
- //door and object id
- case ENTRY_BELLOW_1: forge_bellow[0] = go->GetGUID();
- if (forge_event[0] != NOT_STARTED)HandleGameObject(0, true, go);break;
- case ENTRY_BELLOW_2: forge_bellow[1] = go->GetGUID();
- if (forge_event[1] != NOT_STARTED)HandleGameObject(0, true, go);break;
- case ENTRY_BELLOW_3: forge_bellow[2] = go->GetGUID();
- if (forge_event[2] != NOT_STARTED)HandleGameObject(0, true, go);break;
- case ENTRY_FORGEFIRE_1: forge_fire[0] = go->GetGUID();
- if (forge_event[0] != NOT_STARTED)HandleGameObject(0, true, go);break;
- case ENTRY_FORGEFIRE_2: forge_fire[1] = go->GetGUID();
- if (forge_event[1] != NOT_STARTED)HandleGameObject(0, true, go);break;
- case ENTRY_FORGEFIRE_3: forge_fire[2] = go->GetGUID();
- if (forge_event[2] != NOT_STARTED)HandleGameObject(0, true, go);break;
- case ENTRY_GLOWING_ANVIL_1: forge_anvil[0] = go->GetGUID();
- if (forge_event[0] != NOT_STARTED)HandleGameObject(0, true, go);break;
- case ENTRY_GLOWING_ANVIL_2: forge_anvil[1] = go->GetGUID();
- if (forge_event[1] != NOT_STARTED)HandleGameObject(0, true, go);break;
- case ENTRY_GLOWING_ANVIL_3: forge_anvil[2] = go->GetGUID();
- if (forge_event[2] != NOT_STARTED)HandleGameObject(0, true, go);break;
- case ENTRY_GIANT_PORTCULLIS_1: portcullis[0] = go->GetGUID();
- if (m_auiEncounter[2] == DONE)HandleGameObject(0, true, go);break;
- case ENTRY_GIANT_PORTCULLIS_2: portcullis[1] = go->GetGUID();
- if (m_auiEncounter[2] == DONE)HandleGameObject(0, true, go);break;
+ switch (go->GetEntry())
+ {
+ case GO_BELLOW_1:
+ Forges[0].BellowGUID = go->GetGUID();
+ HandleGameObject(0, Forges[0].Event != NOT_STARTED, go);
+ break;
+ case GO_BELLOW_2:
+ Forges[1].BellowGUID = go->GetGUID();
+ HandleGameObject(0, Forges[1].Event != NOT_STARTED, go);
+ break;
+ case GO_BELLOW_3:
+ Forges[2].BellowGUID = go->GetGUID();
+ HandleGameObject(0, Forges[2].Event != NOT_STARTED, go);
+ break;
+ case GO_FORGEFIRE_1:
+ Forges[0].FireGUID = go->GetGUID();
+ HandleGameObject(0, Forges[0].Event != NOT_STARTED, go);
+ break;
+ case GO_FORGEFIRE_2:
+ Forges[1].FireGUID = go->GetGUID();
+ HandleGameObject(0, Forges[1].Event != NOT_STARTED, go);
+ break;
+ case GO_FORGEFIRE_3:
+ Forges[2].FireGUID = go->GetGUID();
+ HandleGameObject(0, Forges[2].Event != NOT_STARTED, go);
+ break;
+ case GO_GLOWING_ANVIL_1:
+ Forges[0].AnvilGUID = go->GetGUID();
+ HandleGameObject(0, Forges[0].Event != NOT_STARTED, go);
+ break;
+ case GO_GLOWING_ANVIL_2:
+ Forges[1].AnvilGUID = go->GetGUID();
+ HandleGameObject(0, Forges[1].Event != NOT_STARTED, go);
+ break;
+ case GO_GLOWING_ANVIL_3:
+ Forges[2].AnvilGUID = go->GetGUID();
+ HandleGameObject(0, Forges[2].Event != NOT_STARTED, go);
+ break;
+ case GO_GIANT_PORTCULLIS_1:
+ case GO_GIANT_PORTCULLIS_2:
+ AddDoor(go, true);
+ break;
+ default:
+ break;
+ }
}
- }
- uint64 GetData64(uint32 identifier) const OVERRIDE
- {
- switch (identifier)
+ void OnGameObjectRemove(GameObject* go) OVERRIDE
{
- case DATA_PRINCEKELESETH: return Keleseth;
- case DATA_DALRONN: return Dalronn;
- case DATA_SKARVALD: return Skarvald;
- case DATA_INGVAR: return Ingvar;
+ switch (go->GetEntry())
+ {
+ case GO_GIANT_PORTCULLIS_1:
+ case GO_GIANT_PORTCULLIS_2:
+ AddDoor(go, false);
+ break;
+ default:
+ break;
+ }
}
- return 0;
- }
-
- void SetData(uint32 type, uint32 data) OVERRIDE
- {
- switch (type)
+ uint64 GetData64(uint32 type) const OVERRIDE
{
- case DATA_PRINCEKELESETH_EVENT:
- m_auiEncounter[0] = data;
- break;
- case DATA_SKARVALD_DALRONN_EVENT:
- m_auiEncounter[1] = data;
- break;
- case DATA_INGVAR_EVENT:
- if (data == DONE)
- {
- HandleGameObject(portcullis[0], true);
- HandleGameObject(portcullis[1], true);
- }
- m_auiEncounter[2] = data;
- break;
- case EVENT_FORGE_1:
- if (data == NOT_STARTED)
- {
- HandleGameObject(forge_bellow[0], false);
- HandleGameObject(forge_fire[0], false);
- HandleGameObject(forge_anvil[0], false);
- }else
- {
- HandleGameObject(forge_bellow[0], true);
- HandleGameObject(forge_fire[0], true);
- HandleGameObject(forge_anvil[0], true);
- }
- forge_event[0] = data;
- break;
- case EVENT_FORGE_2:
- if (data == NOT_STARTED)
+ switch (type)
{
- HandleGameObject(forge_bellow[1], false);
- HandleGameObject(forge_fire[1], false);
- HandleGameObject(forge_anvil[1], false);
- }else
- {
- HandleGameObject(forge_bellow[1], true);
- HandleGameObject(forge_fire[1], true);
- HandleGameObject(forge_anvil[1], true);
+ case DATA_PRINCE_KELESETH:
+ return PrinceKelesethGUID;
+ case DATA_SKARVALD:
+ return SkarvaldGUID;
+ case DATA_DALRONN:
+ return DalronnGUID;
+ case DATA_INGVAR:
+ return IngvarGUID;
+ default:
+ break;
}
- forge_event[1] = data;
- break;
- case EVENT_FORGE_3:
- if (data == NOT_STARTED)
- {
- HandleGameObject(forge_bellow[2], false);
- HandleGameObject(forge_fire[2], false);
- HandleGameObject(forge_anvil[2], false);
- }else
- {
- HandleGameObject(forge_bellow[2], true);
- HandleGameObject(forge_fire[2], true);
- HandleGameObject(forge_anvil[2], true);
- }
- forge_event[2] = data;
- break;
- }
- if (data == DONE)
- {
- SaveToDB();
+ return 0;
}
- }
- uint32 GetData(uint32 type) const OVERRIDE
- {
- switch (type)
+ void SetData(uint32 type, uint32 data) OVERRIDE
{
- case DATA_PRINCEKELESETH_EVENT: return m_auiEncounter[0];
- case DATA_SKARVALD_DALRONN_EVENT: return m_auiEncounter[1];
- case DATA_INGVAR_EVENT: return m_auiEncounter[2];
+ switch (type)
+ {
+ case DATA_FORGE_1:
+ case DATA_FORGE_2:
+ case DATA_FORGE_3:
+ {
+ uint8 i = type - DATA_FORGE_1;
+ HandleGameObject(Forges[i].AnvilGUID, data != NOT_STARTED);
+ HandleGameObject(Forges[i].BellowGUID, data != NOT_STARTED);
+ HandleGameObject(Forges[i].FireGUID, data != NOT_STARTED);
+ Forges[i].Event = data;
+
+ if (data == DONE)
+ SaveToDB();
+ break;
+ }
+ default:
+ break;
+ }
}
- return 0;
- }
-
- std::string GetSaveData() OVERRIDE
- {
- OUT_SAVE_INST_DATA;
-
- std::ostringstream saveStream;
- saveStream << "U K " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' '
- << m_auiEncounter[2] << ' ' << forge_event[0] << ' ' << forge_event[1] << ' ' << forge_event[2];
+ std::string GetSaveData() OVERRIDE
+ {
+ OUT_SAVE_INST_DATA;
- str_data = saveStream.str();
+ std::ostringstream saveStream;
+ saveStream << "U K " << GetBossSaveData();
+
+ for (uint8 i = 0; i < 3; ++i)
+ saveStream << Forges[i].Event << ' ';
- OUT_SAVE_INST_DATA_COMPLETE;
- return str_data;
- }
+ OUT_SAVE_INST_DATA_COMPLETE;
+ return saveStream.str();
+ }
- void Load(const char* in) OVERRIDE
- {
- if (!in)
+ void Load(char const* str) OVERRIDE
{
- OUT_LOAD_INST_DATA_FAIL;
- return;
- }
+ if (!str)
+ {
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
+ }
- OUT_LOAD_INST_DATA(in);
+ OUT_LOAD_INST_DATA(str);
- char dataHead1, dataHead2;
- uint16 data0, data1, data2, data3, data4, data5;
+ char dataHead1, dataHead2;
- std::istringstream loadStream(in);
- loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3 >> data4 >> data5;
+ std::istringstream loadStream(str);
+ loadStream >> dataHead1 >> dataHead2;
- if (dataHead1 == 'U' && dataHead2 == 'K')
- {
- m_auiEncounter[0] = data0;
- m_auiEncounter[1] = data1;
- m_auiEncounter[2] = data2;
+ if (dataHead1 == 'U' && dataHead2 == 'K')
+ {
+ for (uint32 i = 0; i < EncounterCount; ++i)
+ {
+ uint32 tmpState;
+ loadStream >> tmpState;
+ if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
+ tmpState = NOT_STARTED;
+ SetBossState(i, EncounterState(tmpState));
+ }
+
+ for (uint8 i = 0; i < 3; ++i)
+ loadStream >> Forges[i].Event;
+ }
+ else
+ OUT_LOAD_INST_DATA_FAIL;
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (m_auiEncounter[i] == IN_PROGRESS)
- m_auiEncounter[i] = NOT_STARTED;
+ OUT_LOAD_INST_DATA_COMPLETE;
+ }
- forge_event[0] = data3;
- forge_event[1] = data4;
- forge_event[2] = data5;
+ protected:
+ ForgeInfo Forges[3];
- } else OUT_LOAD_INST_DATA_FAIL;
+ uint64 PrinceKelesethGUID;
+ uint64 SkarvaldGUID;
+ uint64 DalronnGUID;
+ uint64 IngvarGUID;
+ };
- OUT_LOAD_INST_DATA_COMPLETE;
+ InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
+ {
+ return new instance_utgarde_keep_InstanceMapScript(map);
}
- };
-
};
void AddSC_instance_utgarde_keep()
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp
index fa28695ff62..84d6ee1734b 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp
@@ -21,142 +21,97 @@
#include "SpellScript.h"
#include "SpellAuraEffects.h"
-uint32 entry_search[3] =
+uint32 ForgeSearch[3] =
{
- 186609,
- 186610,
- 186611
+ GO_GLOWING_ANVIL_1,
+ GO_GLOWING_ANVIL_2,
+ GO_GLOWING_ANVIL_3
};
class npc_dragonflayer_forge_master : public CreatureScript
{
-public:
- npc_dragonflayer_forge_master() : CreatureScript("npc_dragonflayer_forge_master") { }
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_dragonflayer_forge_masterAI(creature);
- }
+ public:
+ npc_dragonflayer_forge_master() : CreatureScript("npc_dragonflayer_forge_master") { }
- struct npc_dragonflayer_forge_masterAI : public ScriptedAI
- {
- npc_dragonflayer_forge_masterAI(Creature* creature) : ScriptedAI(creature)
+ struct npc_dragonflayer_forge_masterAI : public ScriptedAI
{
- instance = creature->GetInstanceScript();
- fm_Type = 0;
- }
+ npc_dragonflayer_forge_masterAI(Creature* creature) : ScriptedAI(creature)
+ {
+ _instance = creature->GetInstanceScript();
+ _forgeId = 0;
+ }
- InstanceScript* instance;
- uint8 fm_Type;
+ void Reset() OVERRIDE
+ {
+ if (!_forgeId)
+ _forgeId = GetForgeMasterType();
- void Reset() OVERRIDE
- {
- if (fm_Type == 0)
- fm_Type = GetForgeMasterType();
+ if (!me->IsAlive())
+ return;
- CheckForge();
- }
+ if (_forgeId)
+ _instance->SetData(DATA_FORGE_1 + _forgeId - 1, NOT_STARTED);
+ }
- void CheckForge()
- {
- if (instance)
+ void JustDied(Unit* /*killer*/) OVERRIDE
{
- switch (fm_Type)
- {
- case 1:
- instance->SetData(EVENT_FORGE_1, me->IsAlive() ? NOT_STARTED : DONE);
- break;
-
- case 2:
- instance->SetData(EVENT_FORGE_2, me->IsAlive() ? NOT_STARTED : DONE);
- break;
+ if (!_forgeId)
+ _forgeId = GetForgeMasterType();
- case 3:
- instance->SetData(EVENT_FORGE_3, me->IsAlive() ? NOT_STARTED : DONE);
- break;
- }
+ if (_forgeId)
+ _instance->SetData(DATA_FORGE_1 + _forgeId - 1, DONE);
}
- }
-
- void JustDied(Unit* /*killer*/) OVERRIDE
- {
- if (fm_Type == 0)
- fm_Type = GetForgeMasterType();
- if (instance)
+ void EnterCombat(Unit* /*who*/) OVERRIDE
{
- switch (fm_Type)
- {
- case 1:
- instance->SetData(EVENT_FORGE_1, DONE);
- break;
+ if (!_forgeId)
+ _forgeId = GetForgeMasterType();
- case 2:
- instance->SetData(EVENT_FORGE_2, DONE);
- break;
+ if (_forgeId)
+ _instance->SetData(DATA_FORGE_1 + _forgeId - 1, IN_PROGRESS);
- case 3:
- instance->SetData(EVENT_FORGE_3, DONE);
- break;
- }
+ me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
}
- }
-
- void EnterCombat(Unit* /*who*/) OVERRIDE
- {
- if (fm_Type == 0)
- fm_Type = GetForgeMasterType();
- if (instance)
+ void UpdateAI(uint32 /*diff*/) OVERRIDE
{
- switch (fm_Type)
- {
- case 1:
- instance->SetData(EVENT_FORGE_1, IN_PROGRESS);
- break;
+ if (!_forgeId)
+ _forgeId = GetForgeMasterType();
- case 2:
- instance->SetData(EVENT_FORGE_2, IN_PROGRESS);
- break;
+ if (!UpdateVictim())
+ return;
- case 3:
- instance->SetData(EVENT_FORGE_3, IN_PROGRESS);
- break;
- }
+ DoMeleeAttackIfReady();
}
- me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
- }
- uint8 GetForgeMasterType()
- {
- float diff = 30.0f;
- uint8 near_f = 0;
-
- for (uint8 i = 0; i < 3; ++i)
+ private:
+ uint8 GetForgeMasterType()
{
- if (GameObject* go = me->FindNearestGameObject(entry_search[i], 30))
+ float diff = 30.0f;
+ uint8 id = 0;
+
+ for (uint8 i = 0; i < 3; ++i)
{
- if (me->IsWithinDist(go, diff, false))
+ if (GameObject* go = me->FindNearestGameObject(ForgeSearch[i], 30))
{
- near_f = i + 1;
- diff = me->GetDistance2d(go);
+ if (me->IsWithinDist(go, diff, false))
+ {
+ id = i + 1;
+ diff = me->GetDistance2d(go);
+ }
}
}
+ return id > 0 && id < 4 ? id : 0;
}
- return near_f > 0 && near_f < 4 ? near_f : 0;
- }
- void UpdateAI(uint32 /* diff */) OVERRIDE
- {
- if (fm_Type == 0)
- fm_Type = GetForgeMasterType();
-
- if (!UpdateVictim())
- return;
+ InstanceScript* _instance;
+ uint8 _forgeId;
+ };
- DoMeleeAttackIfReady();
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetUtgardeKeepAI<npc_dragonflayer_forge_masterAI>(creature);
}
- };
};
enum TickingTimeBomb
@@ -183,9 +138,7 @@ class spell_ticking_time_bomb : public SpellScriptLoader
void HandleOnEffectRemove(AuraEffect const* /* aurEff */, AuraEffectHandleModes /* mode */)
{
if (GetCaster() == GetTarget())
- {
GetTarget()->CastSpell(GetTarget(), SPELL_TICKING_TIME_BOMB_EXPLODE, true);
- }
}
void Register() OVERRIDE
@@ -204,6 +157,7 @@ enum Fixate
{
SPELL_FIXATE_TRIGGER = 40415
};
+
class spell_fixate : public SpellScriptLoader
{
public:
@@ -222,8 +176,7 @@ class spell_fixate : public SpellScriptLoader
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
{
- // The unit has to cast the taunt on hisself, but we need the original caster for SPELL_AURA_MOD_TAUNT
- GetCaster()->CastSpell(GetCaster(), SPELL_FIXATE_TRIGGER, true, 0, 0, GetHitUnit()->GetGUID());
+ GetHitUnit()->CastSpell(GetCaster(), SPELL_FIXATE_TRIGGER, true);
}
void Register() OVERRIDE
@@ -260,86 +213,86 @@ const Position protodrakeCheckPos = {206.24f, -190.28f, 200.11f, 0.f};
class npc_enslaved_proto_drake : public CreatureScript
{
-public:
- npc_enslaved_proto_drake() : CreatureScript("npc_enslaved_proto_drake") { }
+ public:
+ npc_enslaved_proto_drake() : CreatureScript("npc_enslaved_proto_drake") { }
- struct npc_enslaved_proto_drakeAI : public ScriptedAI
- {
- npc_enslaved_proto_drakeAI(Creature* creature) : ScriptedAI(creature)
+ struct npc_enslaved_proto_drakeAI : public ScriptedAI
{
- _setData = false;
- }
+ npc_enslaved_proto_drakeAI(Creature* creature) : ScriptedAI(creature)
+ {
+ _setData = false;
+ }
- void Reset() OVERRIDE
- {
- _events.Reset();
- _events.ScheduleEvent(EVENT_REND, urand(2000, 3000));
- _events.ScheduleEvent(EVENT_FLAME_BREATH, urand(5500, 7000));
- _events.ScheduleEvent(EVENT_KNOCKAWAY, urand(3500, 6000));
- }
+ void Reset() OVERRIDE
+ {
+ _events.Reset();
+ _events.ScheduleEvent(EVENT_REND, urand(2000, 3000));
+ _events.ScheduleEvent(EVENT_FLAME_BREATH, urand(5500, 7000));
+ _events.ScheduleEvent(EVENT_KNOCKAWAY, urand(3500, 6000));
+ }
- void MovementInform(uint32 type, uint32 id) OVERRIDE
- {
- if (type == WAYPOINT_MOTION_TYPE && id == POINT_LAST)
+ void MovementInform(uint32 type, uint32 id) OVERRIDE
{
- me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER);
+ if (type == WAYPOINT_MOTION_TYPE && id == POINT_LAST)
+ {
+ me->RemoveByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER);
+ }
}
- }
- void SetData(uint32 type, uint32 data) OVERRIDE
- {
- if (type == TYPE_PROTODRAKE_AT && data == DATA_PROTODRAKE_MOVE && !_setData && me->GetDistance(protodrakeCheckPos) < 5.0f)
+ void SetData(uint32 type, uint32 data) OVERRIDE
{
- _setData = true;
- me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER);
- me->GetMotionMaster()->MovePath(PATH_PROTODRAKE, false);
+ if (type == TYPE_PROTODRAKE_AT && data == DATA_PROTODRAKE_MOVE && !_setData && me->GetDistance(protodrakeCheckPos) < 5.0f)
+ {
+ _setData = true;
+ me->SetByteFlag(UNIT_FIELD_BYTES_1, 3, UNIT_BYTE1_FLAG_ALWAYS_STAND | UNIT_BYTE1_FLAG_HOVER);
+ me->GetMotionMaster()->MovePath(PATH_PROTODRAKE, false);
+ }
}
- }
- void UpdateAI(uint32 diff) OVERRIDE
- {
- if (!UpdateVictim())
- return;
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!UpdateVictim())
+ return;
- _events.Update(diff);
+ _events.Update(diff);
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- while (uint32 eventid = _events.ExecuteEvent())
- {
- switch (eventid)
+ while (uint32 eventid = _events.ExecuteEvent())
{
- case EVENT_REND:
- DoCast(SPELL_REND);
- _events.ScheduleEvent(EVENT_REND, urand(15000, 20000));
- break;
- case EVENT_FLAME_BREATH:
- DoCast(SPELL_FLAME_BREATH);
- _events.ScheduleEvent(EVENT_FLAME_BREATH, urand(11000, 12000));
- break;
- case EVENT_KNOCKAWAY:
- DoCast(SPELL_KNOCK_AWAY);
- _events.ScheduleEvent(EVENT_KNOCKAWAY, urand(7000, 8500));
- break;
- default:
- break;
+ switch (eventid)
+ {
+ case EVENT_REND:
+ DoCast(SPELL_REND);
+ _events.ScheduleEvent(EVENT_REND, urand(15000, 20000));
+ break;
+ case EVENT_FLAME_BREATH:
+ DoCast(SPELL_FLAME_BREATH);
+ _events.ScheduleEvent(EVENT_FLAME_BREATH, urand(11000, 12000));
+ break;
+ case EVENT_KNOCKAWAY:
+ DoCast(SPELL_KNOCK_AWAY);
+ _events.ScheduleEvent(EVENT_KNOCKAWAY, urand(7000, 8500));
+ break;
+ default:
+ break;
+ }
}
- }
- DoMeleeAttackIfReady();
- }
+ DoMeleeAttackIfReady();
+ }
- private:
- bool _setData;
- EventMap _events;
+ private:
+ bool _setData;
+ EventMap _events;
- };
+ };
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_enslaved_proto_drakeAI(creature);
- }
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new npc_enslaved_proto_drakeAI(creature);
+ }
};
void AddSC_utgarde_keep()
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h
index b0d9d702db5..ee422400e72 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h
@@ -15,23 +15,73 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef DEF_UTGARDE_KEEP_H
-#define DEF_UTGARDE_KEEP_H
+#ifndef UTGARDE_KEEP_H_
+#define UTGARDE_KEEP_H_
+
+#define UKScriptName "instance_utgarde_keep"
+
+uint32 const EncounterCount = 3;
enum DataTypes
{
- DATA_PRINCEKELESETH = 1,
- DATA_SKARVALD = 3,
- DATA_DALRONN = 4,
- DATA_INGVAR = 6,
-
- DATA_PRINCEKELESETH_EVENT = 2,
- DATA_SKARVALD_DALRONN_EVENT = 5,
- DATA_INGVAR_EVENT = 7,
-
- EVENT_FORGE_1 = 8,
- EVENT_FORGE_2 = 9,
- EVENT_FORGE_3 = 10
+ // Encounter States/Boss GUIDs
+ DATA_PRINCE_KELESETH = 0,
+ DATA_SKARVALD_DALRONN = 1,
+ DATA_INGVAR = 2,
+
+ // Additional Data
+ DATA_SKARVALD = 3,
+ DATA_DALRONN = 4,
+
+ DATA_FORGE_1 = 5,
+ DATA_FORGE_2 = 6,
+ DATA_FORGE_3 = 7
};
-#endif
+enum CreatureIds
+{
+ NPC_PRINCE_KELESETH = 23953,
+ NPC_SKARVALD = 24200,
+ NPC_DALRONN = 24201,
+ NPC_INGVAR = 23954,
+
+ NPC_DALRONN_GHOST = 27389,
+ NPC_SKARVALD_GHOST = 27390
+};
+
+enum GameObjectIds
+{
+ GO_BELLOW_1 = 186688,
+ GO_BELLOW_2 = 186689,
+ GO_BELLOW_3 = 186690,
+
+ GO_FORGEFIRE_1 = 186692,
+ GO_FORGEFIRE_2 = 186693,
+ GO_FORGEFIRE_3 = 186691,
+
+ GO_GLOWING_ANVIL_1 = 186609,
+ GO_GLOWING_ANVIL_2 = 186610,
+ GO_GLOWING_ANVIL_3 = 186611,
+
+ GO_GIANT_PORTCULLIS_1 = 186756,
+ GO_GIANT_PORTCULLIS_2 = 186694
+};
+
+struct ForgeInfo
+{
+ ForgeInfo() : AnvilGUID(0), BellowGUID(0), FireGUID(0), Event(NOT_STARTED) { };
+
+ uint64 AnvilGUID;
+ uint64 BellowGUID;
+ uint64 FireGUID;
+
+ uint32 Event;
+};
+
+template<class AI>
+AI* GetUtgardeKeepAI(Creature* creature)
+{
+ return GetInstanceAI<AI>(creature, UKScriptName);
+}
+
+#endif // UTGARDE_KEEP_H_
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_pinnacle.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp
index 0277c21cb83..0277c21cb83 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_pinnacle.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp
diff --git a/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp
index 77fc0877056..c6e3894a722 100644
--- a/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp
+++ b/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp
@@ -26,14 +26,14 @@
4 - Toravon the Ice Watcher event
*/
-class instance_archavon : public InstanceMapScript
+class instance_vault_of_archavon : public InstanceMapScript
{
public:
- instance_archavon() : InstanceMapScript("instance_archavon", 624) { }
+ instance_vault_of_archavon() : InstanceMapScript("instance_vault_of_archavon", 624) { }
- struct instance_archavon_InstanceMapScript : public InstanceScript
+ struct instance_vault_of_archavon_InstanceMapScript : public InstanceScript
{
- instance_archavon_InstanceMapScript(Map* map) : InstanceScript(map)
+ instance_vault_of_archavon_InstanceMapScript(Map* map) : InstanceScript(map)
{
SetBossNumber(EncounterCount);
@@ -135,11 +135,11 @@ class instance_archavon : public InstanceMapScript
InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
{
- return new instance_archavon_InstanceMapScript(map);
+ return new instance_vault_of_archavon_InstanceMapScript(map);
}
};
-void AddSC_instance_archavon()
+void AddSC_instance_vault_of_archavon()
{
- new instance_archavon();
+ new instance_vault_of_archavon();
}