diff options
author | Malcrom <malcromdev@gmail.com> | 2013-07-08 23:29:55 -0230 |
---|---|---|
committer | Malcrom <malcromdev@gmail.com> | 2013-07-08 23:29:55 -0230 |
commit | ebe1ef249286644c7be7f33b574801c530c68e9a (patch) | |
tree | 40c011df075e358e2dd3124b79341ddf2fae99a9 | |
parent | e464d2bd2c81cd36b1c1360c49c99280fd9a3bd7 (diff) |
Core / Scripting: Updates to Shattered Halls and added Instance save.
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 |