aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMalcrom <malcromdev@gmail.com>2013-07-08 23:29:55 -0230
committerMalcrom <malcromdev@gmail.com>2013-07-08 23:29:55 -0230
commitebe1ef249286644c7be7f33b574801c530c68e9a (patch)
tree40c011df075e358e2dd3124b79341ddf2fae99a9
parente464d2bd2c81cd36b1c1360c49c99280fd9a3bd7 (diff)
Core / Scripting: Updates to Shattered Halls and added Instance save.
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp183
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp221
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp71
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp131
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h20
5 files changed, 342 insertions, 284 deletions
diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp
index e60f76b6389..28d1445d15f 100644
--- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp
@@ -46,7 +46,7 @@ enum Says
enum Spells
{
- SPELL_DEATH_COIL = 30500,
+ SPELL_DEATH_COIL = 30500, // 30741 heroic
SPELL_DARK_SPIN = 30502, // core bug spell attack caster :D
SPELL_SHADOW_FISSURE = 30496, // Summon the ShadowFissure NPC
SPELL_SHADOW_CLEAVE = 30495,
@@ -54,40 +54,30 @@ enum Spells
SPELL_HEMORRHAGE = 30478,
SPELL_CONSUMPTION = 30497,
SPELL_TEMPORARY_VISUAL = 39312, // this is wrong, a temporary solution. spell consumption already has the purple visual, but doesn't display as it should
+
+ SPELL_SHADOW_SEAR = 30735 // cast on entry 17083 which then makes sound 1343
+ // 30948 cast on self by 17687
+};
+
+enum SetData
+{
+ SETDATA_DATA = 1,
+ SETDATA_PEON_AGGRO = 1,
+ SETDATA_PEON_DEATH = 2
};
+// ########################################################
+// Grand Warlock Nethekurse
+// ########################################################
+
class boss_grand_warlock_nethekurse : public CreatureScript
{
public:
+ boss_grand_warlock_nethekurse() : CreatureScript("boss_grand_warlock_nethekurse") { }
- boss_grand_warlock_nethekurse()
- : CreatureScript("boss_grand_warlock_nethekurse")
- {
- }
-
- struct boss_grand_warlock_nethekurseAI : public ScriptedAI
+ struct boss_grand_warlock_nethekurseAI : public BossAI
{
- boss_grand_warlock_nethekurseAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = creature->GetInstanceScript();
- }
-
- InstanceScript* instance;
-
- bool IntroOnce;
- bool IsIntroEvent;
- bool IsMainEvent;
- bool SpinOnce;
- //bool HasTaunted;
- bool Phase;
-
- uint32 PeonEngagedCount;
- uint32 PeonKilledCount;
-
- uint32 IntroEvent_Timer;
- uint32 DeathCoil_Timer;
- uint32 ShadowFissure_Timer;
- uint32 Cleave_Timer;
+ boss_grand_warlock_nethekurseAI(Creature* creature) : BossAI(creature, DATA_NETHEKURSE) { }
void Reset() OVERRIDE
{
@@ -103,34 +93,50 @@ class boss_grand_warlock_nethekurse : public CreatureScript
PeonEngagedCount = 0;
PeonKilledCount = 0;
- IntroEvent_Timer = 90000; //how long before getting bored and kills his minions?
+ IntroEvent_Timer = 90000; // how long before getting bored and kills his minions?
DeathCoil_Timer = 20000;
ShadowFissure_Timer = 8000;
Cleave_Timer = 5000;
}
- void DoYellForPeonAggro()
+ void JustDied(Unit* /*killer*/)
{
- if (PeonEngagedCount >= 4)
- return;
+ Talk(SAY_DIE);
- Talk(SAY_PEON_ATTACKED);
- ++PeonEngagedCount;
+ if (instance)
+ instance->SetBossState(DATA_NETHEKURSE, DONE);
}
- void DoYellForPeonDeath()
+ void SetData(uint32 data, uint32 value)
{
- if (PeonKilledCount >= 4)
+ if (!data == SETDATA_DATA)
return;
- Talk(SAY_PEON_DIES);
- ++PeonKilledCount;
-
- if (PeonKilledCount == 4)
+ switch (value)
{
- IsIntroEvent = false;
- IsMainEvent = true;
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ case SETDATA_PEON_AGGRO:
+ if (PeonEngagedCount >= 4)
+ return;
+
+ Talk(SAY_PEON_ATTACKED);
+ ++PeonEngagedCount;
+ break;
+ case SETDATA_PEON_DEATH:
+ if (PeonKilledCount >= 4)
+ return;
+
+ Talk(SAY_PEON_DIES);
+ ++PeonKilledCount;
+
+ if (PeonKilledCount == 4)
+ {
+ IsIntroEvent = false;
+ IsMainEvent = true;
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ }
+ break;
+ default:
+ break;
}
}
@@ -163,7 +169,7 @@ class boss_grand_warlock_nethekurse : public CreatureScript
void MoveInLineOfSight(Unit* who) OVERRIDE
{
- if (!IntroOnce && me->IsWithinDistInMap(who, 50.0f))
+ if (!IntroOnce && me->IsWithinDistInMap(who, 30.0f))
{
if (who->GetTypeId() != TYPEID_PLAYER)
return;
@@ -173,7 +179,7 @@ class boss_grand_warlock_nethekurse : public CreatureScript
IsIntroEvent = true;
if (instance)
- instance->SetData(TYPE_NETHEKURSE, IN_PROGRESS);
+ instance->SetBossState(DATA_NETHEKURSE, IN_PROGRESS);
}
if (IsIntroEvent || !IsMainEvent)
@@ -203,17 +209,6 @@ class boss_grand_warlock_nethekurse : public CreatureScript
Talk(SAY_SLAY);
}
- void JustDied(Unit* /*killer*/) OVERRIDE
- {
- Talk(SAY_DIE);
-
- if (!instance)
- return;
-
- instance->SetData(TYPE_NETHEKURSE, DONE);
- instance->HandleGameObject(instance->GetData64(DATA_NETHEKURSE_DOOR), true);
- }
-
void UpdateAI(uint32 diff) OVERRIDE
{
if (IsIntroEvent)
@@ -221,7 +216,7 @@ class boss_grand_warlock_nethekurse : public CreatureScript
if (!instance)
return;
- if (instance->GetData(TYPE_NETHEKURSE) == IN_PROGRESS)
+ if (instance->GetBossState(DATA_NETHEKURSE) == IN_PROGRESS)
{
if (IntroEvent_Timer <= diff)
DoTauntPeons();
@@ -278,6 +273,20 @@ class boss_grand_warlock_nethekurse : public CreatureScript
DoMeleeAttackIfReady();
}
}
+
+ private:
+ uint32 PeonEngagedCount;
+ uint32 PeonKilledCount;
+ uint32 IntroEvent_Timer;
+ uint32 DeathCoil_Timer;
+ uint32 ShadowFissure_Timer;
+ uint32 Cleave_Timer;
+ bool IntroOnce;
+ bool IsIntroEvent;
+ bool IsMainEvent;
+ bool SpinOnce;
+ //bool HasTaunted;
+ bool Phase;
};
CreatureAI* GetAI(Creature* creature) const OVERRIDE
@@ -286,14 +295,14 @@ class boss_grand_warlock_nethekurse : public CreatureScript
}
};
+// ########################################################
+// Fel Orc Convert
+// ########################################################
+
class npc_fel_orc_convert : public CreatureScript
{
public:
-
- npc_fel_orc_convert()
- : CreatureScript("npc_fel_orc_convert")
- {
- }
+ npc_fel_orc_convert() : CreatureScript("npc_fel_orc_convert") { }
struct npc_fel_orc_convertAI : public ScriptedAI
{
@@ -302,49 +311,31 @@ class npc_fel_orc_convert : public CreatureScript
instance = creature->GetInstanceScript();
}
- InstanceScript* instance;
- uint32 Hemorrhage_Timer;
-
void Reset() OVERRIDE
{
me->SetNoCallAssistance(true); //we don't want any assistance (WE R HEROZ!)
Hemorrhage_Timer = 3000;
}
- void MoveInLineOfSight(Unit* /*who*/) OVERRIDE
-
- {
- }
+ void MoveInLineOfSight(Unit* /*who*/) OVERRIDE { }
void EnterCombat(Unit* /*who*/) OVERRIDE
{
if (instance)
- {
- if (instance->GetData64(DATA_NETHEKURSE))
- {
- Creature* pKurse = Unit::GetCreature(*me, instance->GetData64(DATA_NETHEKURSE));
- if (pKurse && me->IsWithinDist(pKurse, 45.0f))
- {
- CAST_AI(boss_grand_warlock_nethekurse::boss_grand_warlock_nethekurseAI, pKurse->AI())->DoYellForPeonAggro();
-
- if (instance->GetData(TYPE_NETHEKURSE) == IN_PROGRESS)
- return;
- else
- instance->SetData(TYPE_NETHEKURSE, IN_PROGRESS);
- }
- }
- }
+ if (Creature* Kurse = Unit::GetCreature(*me, instance->GetData64(NPC_GRAND_WARLOCK_NETHEKURSE)))
+ if (Kurse && me->IsWithinDist(Kurse, 45.0f))
+ Kurse->AI()->SetData(SETDATA_DATA, SETDATA_PEON_AGGRO);
}
void JustDied(Unit* /*killer*/) OVERRIDE
{
if (instance)
{
- if (instance->GetData(TYPE_NETHEKURSE) != IN_PROGRESS)
+ if (instance->GetBossState(DATA_NETHEKURSE) != IN_PROGRESS)
return;
- if (instance->GetData64(DATA_NETHEKURSE))
- if (Creature* pKurse = Unit::GetCreature(*me, instance->GetData64(DATA_NETHEKURSE)))
- CAST_AI(boss_grand_warlock_nethekurse::boss_grand_warlock_nethekurseAI, pKurse->AI())->DoYellForPeonDeath();
+ if (instance->GetData64(NPC_GRAND_WARLOCK_NETHEKURSE))
+ if (Creature* Kurse = Unit::GetCreature(*me, instance->GetData64(NPC_GRAND_WARLOCK_NETHEKURSE)))
+ Kurse->AI()->SetData(SETDATA_DATA, SETDATA_PEON_DEATH);
}
}
@@ -361,6 +352,10 @@ class npc_fel_orc_convert : public CreatureScript
DoMeleeAttackIfReady();
}
+
+ private:
+ InstanceScript* instance;
+ uint32 Hemorrhage_Timer;
};
CreatureAI* GetAI(Creature* creature) const OVERRIDE
@@ -369,15 +364,14 @@ class npc_fel_orc_convert : public CreatureScript
}
};
-//NOTE: this Creature are also summoned by other spells, for different creatures
+// ########################################################
+// Lesser Shadow Fissure
+// ########################################################
+
class npc_lesser_shadow_fissure : public CreatureScript
{
public:
-
- npc_lesser_shadow_fissure()
- : CreatureScript("npc_lesser_shadow_fissure")
- {
- }
+ npc_lesser_shadow_fissure() : CreatureScript("npc_lesser_shadow_fissure") { }
struct npc_lesser_shadow_fissureAI : public ScriptedAI
{
@@ -385,7 +379,6 @@ class npc_lesser_shadow_fissure : public CreatureScript
void Reset() OVERRIDE {}
void MoveInLineOfSight(Unit* /*who*/) OVERRIDE {}
-
void AttackStart(Unit* /*who*/) OVERRIDE {}
void EnterCombat(Unit* /*who*/) OVERRIDE {}
};
diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp
index c8fd429bb33..03bb002809b 100644
--- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp
@@ -55,6 +55,12 @@ enum Creatures
NPC_RIGHT_HEAD = 19524
};
+enum SetData
+{
+ SETDATA_DATA = 1,
+ SETDATA_YELL = 1
+};
+
struct Yell
{
int32 id;
@@ -67,6 +73,7 @@ static Yell GoCombat[]=
{1, NPC_LEFT_HEAD},
{2, NPC_LEFT_HEAD},
};
+
static Yell GoCombatDelay[]=
{
{0, NPC_RIGHT_HEAD},
@@ -81,6 +88,7 @@ static Yell Threat[]=
{4, NPC_LEFT_HEAD},
{5, NPC_LEFT_HEAD},
};
+
static Yell ThreatDelay1[]=
{
{4, NPC_RIGHT_HEAD},
@@ -88,6 +96,7 @@ static Yell ThreatDelay1[]=
{5, NPC_RIGHT_HEAD},
{6, NPC_RIGHT_HEAD},
};
+
static Yell ThreatDelay2[]=
{
{7, NPC_LEFT_HEAD},
@@ -108,104 +117,34 @@ static Yell KillingDelay[]=
{11, NPC_LEFT_HEAD},
};
-class npc_omrogg_heads : public CreatureScript
-{
- public:
-
- npc_omrogg_heads()
- : CreatureScript("npc_omrogg_heads")
- {
- }
-
- struct npc_omrogg_headsAI : public ScriptedAI
- {
- npc_omrogg_headsAI(Creature* creature) : ScriptedAI(creature) {}
-
- bool DeathYell;
- uint32 Death_Timer;
-
- void Reset() OVERRIDE
- {
- Death_Timer = 4000;
- DeathYell = false;
- }
- void EnterCombat(Unit* /*who*/) OVERRIDE {}
-
- void DoDeathYell()
- {
- DeathYell = true;
- }
-
- void UpdateAI(uint32 diff) OVERRIDE
- {
- if (!DeathYell)
- return;
-
- if (Death_Timer <= diff)
- {
- Talk(YELL_DIE_R);
- Death_Timer = false;
- me->setDeathState(JUST_DIED);
- } else Death_Timer -= diff;
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const OVERRIDE
- {
- return new npc_omrogg_headsAI(creature);
- }
-};
+// ########################################################
+// Warbringer_Omrogg
+// ########################################################
class boss_warbringer_omrogg : public CreatureScript
{
public:
+ boss_warbringer_omrogg() : CreatureScript("boss_warbringer_omrogg") { }
- boss_warbringer_omrogg()
- : CreatureScript("boss_warbringer_omrogg")
+ struct boss_warbringer_omroggAI : public BossAI
{
- }
-
- struct boss_warbringer_omroggAI : public ScriptedAI
- {
- boss_warbringer_omroggAI(Creature* creature) : ScriptedAI(creature)
+ boss_warbringer_omroggAI(Creature* creature) : BossAI(creature, DATA_OMROGG)
{
LeftHeadGUID = 0;
RightHeadGUID = 0;
- instance = creature->GetInstanceScript();
}
- InstanceScript* instance;
-
- uint64 LeftHeadGUID;
- uint64 RightHeadGUID;
- int iaggro;
- int ithreat;
- int ikilling;
-
- bool AggroYell;
- bool ThreatYell;
- bool ThreatYell2;
- bool KillingYell;
-
- uint32 Delay_Timer;
- uint32 BlastWave_Timer;
- uint32 BlastCount;
- uint32 Fear_Timer;
- uint32 BurningMaul_Timer;
- uint32 ThunderClap_Timer;
- uint32 ResetThreat_Timer;
-
void Reset() OVERRIDE
{
- if (Unit* pLeftHead = Unit::GetUnit(*me, LeftHeadGUID))
+ if (Unit* LeftHead = Unit::GetUnit(*me, LeftHeadGUID))
{
- pLeftHead->setDeathState(JUST_DIED);
+ LeftHead->setDeathState(JUST_DIED);
LeftHeadGUID = 0;
}
- if (Unit* pRightHead = Unit::GetUnit(*me, RightHeadGUID))
+ if (Unit* RightHead = Unit::GetUnit(*me, RightHeadGUID))
{
- pRightHead->setDeathState(JUST_DIED);
+ RightHead->setDeathState(JUST_DIED);
RightHeadGUID = 0;
}
@@ -223,20 +162,20 @@ class boss_warbringer_omrogg : public CreatureScript
ResetThreat_Timer = 30000;
if (instance)
- instance->SetData(TYPE_OMROGG, NOT_STARTED); //End boss can use this later. O'mrogg must be defeated(DONE) or he will come to aid.
+ instance->SetData(DATA_OMROGG, NOT_STARTED); //End boss can use this later. O'mrogg must be defeated(DONE) or he will come to aid.
}
void DoYellForThreat()
{
- Creature* pLeftHead = Creature::GetCreature(*me, LeftHeadGUID);
- Creature* pRightHead = Unit::GetCreature(*me, RightHeadGUID);
+ Creature* LeftHead = Creature::GetCreature(*me, LeftHeadGUID);
+ Creature* RightHead = Unit::GetCreature(*me, RightHeadGUID);
- if (!pLeftHead || !pRightHead)
+ if (!LeftHead || !RightHead)
return;
ithreat = rand()%4;
- Creature* source = (pLeftHead->GetEntry() == Threat[ithreat].creature ? pLeftHead : pRightHead);
+ Creature* source = (LeftHead->GetEntry() == Threat[ithreat].creature ? LeftHead : RightHead);
source->AI()->Talk(Threat[ithreat].id);
@@ -249,18 +188,18 @@ class boss_warbringer_omrogg : public CreatureScript
me->SummonCreature(NPC_LEFT_HEAD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0);
me->SummonCreature(NPC_RIGHT_HEAD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0);
- if (Creature* pLeftHead = Creature::GetCreature(*me, LeftHeadGUID))
+ if (Creature* LeftHead = Creature::GetCreature(*me, LeftHeadGUID))
{
iaggro = rand()%3;
- pLeftHead->AI()->Talk(GoCombat[iaggro].id);
+ LeftHead->AI()->Talk(GoCombat[iaggro].id);
Delay_Timer = 3500;
AggroYell = true;
}
if (instance)
- instance->SetData(TYPE_OMROGG, IN_PROGRESS);
+ instance->SetBossState(DATA_OMROGG, IN_PROGRESS);
}
void JustSummoned(Creature* summoned) OVERRIDE
@@ -278,15 +217,15 @@ class boss_warbringer_omrogg : public CreatureScript
void KilledUnit(Unit* /*victim*/) OVERRIDE
{
- Creature* pLeftHead = Creature::GetCreature(*me, LeftHeadGUID);
- Creature* pRightHead = Creature::GetCreature(*me, RightHeadGUID);
+ Creature* LeftHead = Creature::GetCreature(*me, LeftHeadGUID);
+ Creature* RightHead = Creature::GetCreature(*me, RightHeadGUID);
- if (!pLeftHead || !pRightHead)
+ if (!LeftHead || !RightHead)
return;
ikilling = rand()%2;
- Creature* source = (pLeftHead->GetEntry() == Killing[ikilling].creature ? pLeftHead : pRightHead);
+ Creature* source = (LeftHead->GetEntry() == Killing[ikilling].creature ? LeftHead : RightHead);
switch (ikilling)
{
@@ -304,18 +243,18 @@ class boss_warbringer_omrogg : public CreatureScript
void JustDied(Unit* /*killer*/) OVERRIDE
{
- Creature* pLeftHead = Creature::GetCreature(*me, LeftHeadGUID);
- Creature* pRightHead = Creature::GetCreature(*me, RightHeadGUID);
+ Creature* LeftHead = Creature::GetCreature(*me, LeftHeadGUID);
+ Creature* RightHead = Creature::GetCreature(*me, RightHeadGUID);
- if (!pLeftHead || !pRightHead)
+ if (!LeftHead || !RightHead)
return;
- pLeftHead->AI()->Talk(YELL_DIE_L);
+ LeftHead->AI()->Talk(YELL_DIE_L);
- CAST_AI(npc_omrogg_heads::npc_omrogg_headsAI, pRightHead->ToCreature()->AI())->DoDeathYell();
+ RightHead->AI()->SetData(SETDATA_DATA, SETDATA_YELL);
if (instance)
- instance->SetData(TYPE_OMROGG, DONE);
+ instance->SetBossState(DATA_OMROGG, DONE);
}
void UpdateAI(uint32 diff) OVERRIDE
@@ -324,21 +263,21 @@ class boss_warbringer_omrogg : public CreatureScript
{
Delay_Timer = 3500;
- Creature* pLeftHead = Creature::GetCreature(*me, LeftHeadGUID);
- Creature* pRightHead = Creature::GetCreature(*me, RightHeadGUID);
+ Creature* LeftHead = Creature::GetCreature(*me, LeftHeadGUID);
+ Creature* RightHead = Creature::GetCreature(*me, RightHeadGUID);
- if (!pLeftHead || !pRightHead)
+ if (!LeftHead || !RightHead)
return;
if (AggroYell)
{
- pRightHead->AI()->Talk(GoCombatDelay[iaggro].id);
+ RightHead->AI()->Talk(GoCombatDelay[iaggro].id);
AggroYell = false;
}
if (ThreatYell2)
{
- Creature* source = (pLeftHead->GetEntry() == ThreatDelay2[ithreat].creature ? pLeftHead : pRightHead);
+ Creature* source = (LeftHead->GetEntry() == ThreatDelay2[ithreat].creature ? LeftHead : RightHead);
source->AI()->Talk(ThreatDelay2[ithreat].id);
ThreatYell2 = false;
@@ -346,7 +285,7 @@ class boss_warbringer_omrogg : public CreatureScript
if (ThreatYell)
{
- Creature* source = (pLeftHead->GetEntry() == ThreatDelay1[ithreat].creature ? pLeftHead : pRightHead);
+ Creature* source = (LeftHead->GetEntry() == ThreatDelay1[ithreat].creature ? LeftHead : RightHead);
source->AI()->Talk(ThreatDelay1[ithreat].id);
ThreatYell = false;
@@ -355,7 +294,7 @@ class boss_warbringer_omrogg : public CreatureScript
if (KillingYell)
{
- Creature* source = (pLeftHead->GetEntry() == KillingDelay[ikilling].creature ? pLeftHead : pRightHead);
+ Creature* source = (LeftHead->GetEntry() == KillingDelay[ikilling].creature ? LeftHead : RightHead);
source->AI()->Talk(KillingDelay[ikilling].id);
KillingYell = false;
@@ -419,6 +358,26 @@ class boss_warbringer_omrogg : public CreatureScript
DoMeleeAttackIfReady();
}
+
+ private:
+ uint64 LeftHeadGUID;
+ uint64 RightHeadGUID;
+ int iaggro;
+ int ithreat;
+ int ikilling;
+
+ bool AggroYell;
+ bool ThreatYell;
+ bool ThreatYell2;
+ bool KillingYell;
+
+ uint32 Delay_Timer;
+ uint32 BlastWave_Timer;
+ uint32 BlastCount;
+ uint32 Fear_Timer;
+ uint32 BurningMaul_Timer;
+ uint32 ThunderClap_Timer;
+ uint32 ResetThreat_Timer;
};
CreatureAI* GetAI(Creature* creature) const OVERRIDE
@@ -426,6 +385,58 @@ class boss_warbringer_omrogg : public CreatureScript
return new boss_warbringer_omroggAI(creature);
}
};
+
+// ########################################################
+// Omrogg Heads
+// ########################################################
+
+class npc_omrogg_heads : public CreatureScript
+{
+ public:
+ npc_omrogg_heads() : CreatureScript("npc_omrogg_heads") { }
+
+ struct npc_omrogg_headsAI : public ScriptedAI
+ {
+ npc_omrogg_headsAI(Creature* creature) : ScriptedAI(creature) { }
+
+ void Reset() OVERRIDE
+ {
+ Death_Timer = 4000;
+ DeathYell = false;
+ }
+
+ void EnterCombat(Unit* /*who*/) OVERRIDE {}
+
+ void SetData(uint32 data, uint32 value)
+ {
+ if (data == SETDATA_DATA && value == SETDATA_YELL)
+ DeathYell = true;
+ }
+
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!DeathYell)
+ return;
+
+ if (Death_Timer <= diff)
+ {
+ Talk(YELL_DIE_R);
+ Death_Timer = false;
+ me->setDeathState(JUST_DIED);
+ } else Death_Timer -= diff;
+ }
+
+ private:
+ uint32 Death_Timer;
+ bool DeathYell;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new npc_omrogg_headsAI(creature);
+ }
+};
+
void AddSC_boss_warbringer_omrogg()
{
new boss_warbringer_omrogg();
diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp
index 05f1bb7121c..87b94deb552 100644
--- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp
@@ -29,6 +29,7 @@ EndContentData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "shattered_halls.h"
enum Says
{
@@ -39,8 +40,8 @@ enum Says
enum Spells
{
- SPELL_BLADE_DANCE = 30739,
- H_SPELL_CHARGE = 25821,
+ SPELL_BLADE_DANCE = 30739,
+ H_SPELL_CHARGE = 25821
};
enum Creatures
@@ -48,45 +49,23 @@ enum Creatures
NPC_SHATTERED_ASSASSIN = 17695,
NPC_HEARTHEN_GUARD = 17621,
NPC_SHARPSHOOTER_GUARD = 17622,
- NPC_REAVER_GUARD = 17623,
+ NPC_REAVER_GUARD = 17623
};
-#define TARGET_NUM 5
+#define TARGET_NUM 5
-float AssassEntrance[3] = {275.136f, -84.29f, 2.3f}; // y -8
-float AssassExit[3] = {184.233f, -84.29f, 2.3f}; // y -8
-float AddsEntrance[3] = {306.036f, -84.29f, 1.93f};
+float AssassEntrance[3] = { 275.136f, -84.29f, 2.3f }; // y -8
+float AssassExit[3] = { 184.233f, -84.29f, 2.3f }; // y -8
+float AddsEntrance[3] = { 306.036f, -84.29f, 1.93f };
class boss_warchief_kargath_bladefist : public CreatureScript
{
public:
+ boss_warchief_kargath_bladefist() : CreatureScript("boss_warchief_kargath_bladefist") { }
- boss_warchief_kargath_bladefist()
- : CreatureScript("boss_warchief_kargath_bladefist")
+ struct boss_warchief_kargath_bladefistAI : public BossAI
{
- }
-
- struct boss_warchief_kargath_bladefistAI : public ScriptedAI
- {
- boss_warchief_kargath_bladefistAI(Creature* creature) : ScriptedAI(creature)
- {
- }
-
- std::vector<uint64> adds;
- std::vector<uint64> assassins;
-
- uint32 Charge_timer;
- uint32 Blade_Dance_Timer;
- uint32 Summon_Assistant_Timer;
- uint32 resetcheck_timer;
- uint32 Wait_Timer;
-
- uint32 Assassins_Timer;
-
- uint32 summoned;
- bool InBlade;
-
- uint32 target_num;
+ boss_warchief_kargath_bladefistAI(Creature* creature) : BossAI(creature, DATA_KARGATH) { }
void Reset() OVERRIDE
{
@@ -106,6 +85,15 @@ class boss_warchief_kargath_bladefist : public CreatureScript
resetcheck_timer = 5000;
}
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ Talk(SAY_DEATH);
+ removeAdds();
+
+ if (instance)
+ instance->SetBossState(DATA_KARGATH, DONE);
+ }
+
void EnterCombat(Unit* /*who*/) OVERRIDE
{
Talk(SAY_AGGRO);
@@ -135,12 +123,6 @@ class boss_warchief_kargath_bladefist : public CreatureScript
}
}
- void JustDied(Unit* /*killer*/) OVERRIDE
- {
- Talk(SAY_DEATH);
- removeAdds();
- }
-
void MovementInform(uint32 type, uint32 id) OVERRIDE
{
if (InBlade)
@@ -312,6 +294,19 @@ class boss_warchief_kargath_bladefist : public CreatureScript
else
resetcheck_timer -= diff;
}
+
+ private:
+ std::vector<uint64> adds;
+ std::vector<uint64> assassins;
+ uint32 Charge_timer;
+ uint32 Blade_Dance_Timer;
+ uint32 Summon_Assistant_Timer;
+ uint32 resetcheck_timer;
+ uint32 Wait_Timer;
+ uint32 Assassins_Timer;
+ uint32 summoned;
+ uint32 target_num;
+ bool InBlade;
};
CreatureAI* GetAI(Creature* creature) const OVERRIDE
diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp
index 0f00d73a81d..693373823d6 100644
--- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp
@@ -19,7 +19,7 @@
/* ScriptData
SDName: Instance_Shattered_Halls
SD%Complete: 50
-SDComment: currently missing info about door. instance not complete
+SDComment: instance not complete
SDCategory: Hellfire Citadel, Shattered Halls
EndScriptData */
@@ -27,39 +27,37 @@ EndScriptData */
#include "InstanceScript.h"
#include "shattered_halls.h"
-#define MAX_ENCOUNTER 2
-
-#define DOOR_NETHEKURSE 1
-
class instance_shattered_halls : public InstanceMapScript
{
public:
- instance_shattered_halls()
- : InstanceMapScript("instance_shattered_halls", 540)
+ instance_shattered_halls() : InstanceMapScript("instance_shattered_halls", 540) { }
+
+ InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
{
+ return new instance_shattered_halls_InstanceMapScript(map);
}
+
struct instance_shattered_halls_InstanceMapScript : public InstanceScript
{
- instance_shattered_halls_InstanceMapScript(Map* map) : InstanceScript(map) {}
-
- uint32 m_auiEncounter[MAX_ENCOUNTER];
- uint64 nethekurseGUID;
- uint64 nethekurseDoorGUID;
+ instance_shattered_halls_InstanceMapScript(Map* map) : InstanceScript(map) { }
void Initialize()
{
- memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
-
- nethekurseGUID = 0;
- nethekurseDoorGUID = 0;
+ SetBossNumber(EncounterCount);
+ nethekurseGUID = 0;
+ nethekurseDoor1GUID = 0;
+ nethekurseDoor2GUID = 0;
}
void OnGameObjectCreate(GameObject* go)
{
switch (go->GetEntry())
{
- case DOOR_NETHEKURSE:
- nethekurseDoorGUID = go->GetGUID();
+ case GO_GRAND_WARLOCK_CHAMBER_DOOR_1:
+ nethekurseDoor1GUID = go->GetGUID();
+ break;
+ case GO_GRAND_WARLOCK_CHAMBER_DOOR_2:
+ nethekurseDoor2GUID = go->GetGUID();
break;
}
}
@@ -68,54 +66,103 @@ class instance_shattered_halls : public InstanceMapScript
{
switch (creature->GetEntry())
{
- case 16807:
+ case NPC_GRAND_WARLOCK_NETHEKURSE:
nethekurseGUID = creature->GetGUID();
break;
}
}
- void SetData(uint32 type, uint32 data) OVERRIDE
+ bool SetBossState(uint32 type, EncounterState state)
{
+ if (!InstanceScript::SetBossState(type, state))
+ return false;
+
switch (type)
{
- case TYPE_NETHEKURSE:
- m_auiEncounter[0] = data;
+ case DATA_NETHEKURSE:
+ if (state == IN_PROGRESS)
+ {
+ HandleGameObject(nethekurseDoor1GUID, false);
+ HandleGameObject(nethekurseDoor2GUID, false);
+ }
+ else
+ {
+ HandleGameObject(nethekurseDoor1GUID, true);
+ HandleGameObject(nethekurseDoor2GUID, true);
+ }
break;
- case TYPE_OMROGG:
- m_auiEncounter[1] = data;
+ case DATA_OMROGG:
break;
}
}
- uint32 GetData(uint32 type) const OVERRIDE
+ uint64 GetData64(uint32 data) const OVERRIDE
{
- switch (type)
+ switch (data)
{
- case TYPE_NETHEKURSE:
- return m_auiEncounter[0];
- case TYPE_OMROGG:
- return m_auiEncounter[1];
+ case NPC_GRAND_WARLOCK_NETHEKURSE:
+ return nethekurseGUID;
+ break;
+ case GO_GRAND_WARLOCK_CHAMBER_DOOR_1:
+ return nethekurseDoor1GUID;
+ break;
+ case GO_GRAND_WARLOCK_CHAMBER_DOOR_2:
+ return nethekurseDoor2GUID;
+ break;
}
return 0;
}
- uint64 GetData64(uint32 data) const OVERRIDE
+ std::string GetSaveData()
{
- switch (data)
+ OUT_SAVE_INST_DATA;
+
+ std::ostringstream saveStream;
+ saveStream << "S H " << GetBossSaveData();
+
+ OUT_SAVE_INST_DATA_COMPLETE;
+ return saveStream.str();
+ }
+
+ void Load(const char* strIn)
+ {
+ if (!strIn)
{
- case DATA_NETHEKURSE:
- return nethekurseGUID;
- case DATA_NETHEKURSE_DOOR:
- return nethekurseDoorGUID;
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
}
- return 0;
+
+ OUT_LOAD_INST_DATA(strIn);
+
+ char dataHead1, dataHead2;
+
+ std::istringstream loadStream(strIn);
+ loadStream >> dataHead1 >> dataHead2;
+
+ if (dataHead1 == 'S' && dataHead2 == 'H')
+ {
+ for (uint8 i = 0; i < EncounterCount; ++i)
+ {
+ uint32 tmpState;
+ loadStream >> tmpState;
+ if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
+ tmpState = NOT_STARTED;
+ SetBossState(i, EncounterState(tmpState));
+ }
+ }
+ else
+ OUT_LOAD_INST_DATA_FAIL;
+
+ OUT_LOAD_INST_DATA_COMPLETE;
}
- };
- InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
- {
- return new instance_shattered_halls_InstanceMapScript(map);
- }
+ protected:
+ uint32 encounter[EncounterCount];
+ std::string m_strInstData;
+ uint64 nethekurseGUID;
+ uint64 nethekurseDoor1GUID;
+ uint64 nethekurseDoor2GUID;
+ };
};
void AddSC_instance_shattered_halls()
diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h
index 9d9fbf6aec0..888a9cb5010 100644
--- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h
+++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h
@@ -19,12 +19,24 @@
#ifndef DEF_SHATTERED_H
#define DEF_SHATTERED_H
+uint32 const EncounterCount = 3;
+
enum DataTypes
{
- TYPE_NETHEKURSE = 1,
- DATA_NETHEKURSE = 2,
- DATA_NETHEKURSE_DOOR = 3,
+ DATA_NETHEKURSE = 1,
+ DATA_OMROGG = 2,
+ DATA_KARGATH = 3
+};
- TYPE_OMROGG = 4
+enum CreatureIds
+{
+ NPC_GRAND_WARLOCK_NETHEKURSE = 16807
};
+
+enum GameobjectIds
+{
+ GO_GRAND_WARLOCK_CHAMBER_DOOR_1 = 182539,
+ GO_GRAND_WARLOCK_CHAMBER_DOOR_2 = 182540
+};
+
#endif