aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/scripts')
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp56
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp10
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp230
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp69
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h17
5 files changed, 240 insertions, 142 deletions
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp
index 7d2c8807eeb..51aab7c20d0 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp
@@ -79,11 +79,7 @@ class boss_arlokk : public CreatureScript
struct boss_arlokkAI : public BossAI
{
- boss_arlokkAI(Creature* creature) : BossAI(creature, DATA_ARLOKK) {}
-
- uint32 summonCount;
- // Unit* markedTarget;
- uint64 markedTargetGUID;
+ boss_arlokkAI(Creature* creature) : BossAI(creature, DATA_ARLOKK) { }
void Reset()
{
@@ -113,13 +109,15 @@ class boss_arlokk : public CreatureScript
void JustReachedHome()
{
- if (instance)
- instance->SetData(DATA_ARLOKK, NOT_STARTED);
+ instance->SetBossState(DATA_ARLOKK, NOT_STARTED);
me->DespawnOrUnsummon();
}
void DoSummonPhanters()
{
+ if (summonCount > 30)
+ return;
+
if (markedTargetGUID)
Talk(SAY_FEAST_PANTHER, markedTargetGUID);
me->SummonCreature(NPC_ZULIAN_PROWLER, PosSummonProwlers[0], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
@@ -152,7 +150,8 @@ class boss_arlokk : public CreatureScript
events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 15000, 0, PHASE_ONE);
break;
case EVENT_MARK:
- DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true), SPELL_MARK);
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
+ DoCast(target, SPELL_MARK);
events.ScheduleEvent(EVENT_MARK, 15000, 0, PHASE_ONE);
break;
case EVENT_CLEAVE:
@@ -164,8 +163,7 @@ class boss_arlokk : public CreatureScript
events.ScheduleEvent(EVENT_GOUGE, urand(17000, 27000), 0, PHASE_TWO);
break;
case EVENT_SUMMON:
- if (summonCount <= 30)
- DoSummonPhanters();
+ DoSummonPhanters();
events.ScheduleEvent(EVENT_SUMMON, 5000);
break;
case EVENT_VANISH:
@@ -176,21 +174,21 @@ class boss_arlokk : public CreatureScript
events.ScheduleEvent(EVENT_VISIBLE, 6000);
break;
case EVENT_VISIBLE:
- {
- me->SetDisplayId(MODEL_ID_PANTHER);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- const CreatureTemplate* cinfo = me->GetCreatureTemplate();
- me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35)));
- me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35)));
- me->UpdateDamagePhysical(BASE_ATTACK);
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
- AttackStart(target);
- events.ScheduleEvent(EVENT_VANISH, 39000);
- events.ScheduleEvent(EVENT_CLEAVE, 0, PHASE_TWO);
- events.ScheduleEvent(EVENT_GOUGE, 14000, 0, PHASE_TWO);
- events.SetPhase(PHASE_TWO);
- break;
- }
+ {
+ me->SetDisplayId(MODEL_ID_PANTHER);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ const CreatureTemplate* cinfo = me->GetCreatureTemplate();
+ me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35)));
+ me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35)));
+ me->UpdateDamagePhysical(BASE_ATTACK);
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ AttackStart(target);
+ events.ScheduleEvent(EVENT_VANISH, 39000);
+ events.ScheduleEvent(EVENT_CLEAVE, 0, PHASE_TWO);
+ events.ScheduleEvent(EVENT_GOUGE, 14000, 0, PHASE_TWO);
+ events.SetPhase(PHASE_TWO);
+ break;
+ }
default:
break;
}
@@ -198,11 +196,15 @@ class boss_arlokk : public CreatureScript
DoMeleeAttackIfReady();
}
+
+ private:
+ uint32 summonCount;
+ uint64 markedTargetGUID;
};
CreatureAI* GetAI(Creature* creature) const
{
- return new boss_arlokkAI(creature);
+ return GetZulGurubAI<boss_arlokkAI>(creature);
}
};
@@ -214,7 +216,7 @@ class go_gong_of_bethekk : public GameObjectScript
{
if (InstanceScript* instance = go->GetInstanceScript())
{
- if (instance->GetData(DATA_ARLOKK) == DONE || instance->GetBossState(DATA_ARLOKK) == IN_PROGRESS)
+ if (instance->GetBossState(DATA_ARLOKK) == DONE || instance->GetBossState(DATA_ARLOKK) == IN_PROGRESS)
return true;
instance->SetBossState(DATA_ARLOKK, IN_PROGRESS);
return true;
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp
index 8003f4a1ed7..68aac7547df 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp
@@ -90,15 +90,15 @@ class boss_hakkar : public CreatureScript
events.ScheduleEvent(EVENT_CAUSE_INSANITY, 17000);
events.ScheduleEvent(EVENT_WILL_OF_HAKKAR, 17000);
events.ScheduleEvent(EVENT_ENRAGE, 600000);
- if (instance->GetData(DATA_JEKLIK) != DONE)
+ if (instance->GetBossState(DATA_JEKLIK) != DONE)
events.ScheduleEvent(EVENT_ASPECT_OF_JEKLIK, 4000);
- if (instance->GetData(DATA_VENOXIS) != DONE)
+ if (instance->GetBossState(DATA_VENOXIS) != DONE)
events.ScheduleEvent(EVENT_ASPECT_OF_VENOXIS, 7000);
- if (instance->GetData(DATA_MARLI) != DONE)
+ if (instance->GetBossState(DATA_MARLI) != DONE)
events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 12000);
- if (instance->GetData(DATA_THEKAL) != DONE)
+ if (instance->GetBossState(DATA_THEKAL) != DONE)
events.ScheduleEvent(EVENT_ASPECT_OF_THEKAL, 8000);
- if (instance->GetData(DATA_ARLOKK) != DONE)
+ if (instance->GetBossState(DATA_ARLOKK) != DONE)
events.ScheduleEvent(EVENT_ASPECT_OF_ARLOKK, 18000);
Talk(SAY_AGGRO);
}
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
index acfa38e542d..e402480609b 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
@@ -25,6 +25,9 @@ EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "Spell.h"
+#include "SpellAuras.h"
+#include "SpellScript.h"
#include "zulgurub.h"
enum Says
@@ -52,19 +55,22 @@ enum Spells
enum Events
{
- EVENT_CHECK_START = 1,
- EVENT_STARTED = 2,
- EVENT_OVERPOWER = 3,
- EVENT_MORTAL_STRIKE = 4,
- EVENT_WHIRLWIND = 5,
- EVENT_CHECK_OHGAN = 6,
- EVENT_WATCH_PLAYER = 7
+ EVENT_CHECK_SPEAKER = 1,
+ EVENT_CHECK_START = 2,
+ EVENT_STARTED = 3,
+ EVENT_OVERPOWER = 4,
+ EVENT_MORTAL_STRIKE = 5,
+ EVENT_WHIRLWIND = 6,
+ EVENT_CHECK_OHGAN = 7,
+ EVENT_WATCH_PLAYER = 8,
+ EVENT_CHARGE_PLAYER = 9
};
enum Misc
{
MODEL_OHGAN_MOUNT = 15271,
PATH_MANDOKIR = 492861,
+ POINT_MANDOKIR_END = 24,
CHAINED_SPIRT_COUNT = 20
};
@@ -92,33 +98,44 @@ Position const PosSummonChainedSpirits[CHAINED_SPIRT_COUNT] =
{ -12283.51f, -1924.839f, 133.5170f, 0.069813f }
};
+Position const PosMandokir[2] =
+{
+ { -12167.8f, -1927.25f, 153.73f, 3.76991f },
+ { -12197.86f, -1949.392f, 130.2745f, 0.0f }
+};
+
class boss_mandokir : public CreatureScript
{
public: boss_mandokir() : CreatureScript("boss_mandokir") {}
struct boss_mandokirAI : public BossAI
{
- boss_mandokirAI(Creature* creature) : BossAI(creature, DATA_MANDOKIR) {}
-
- uint8 killCount;
+ boss_mandokirAI(Creature* creature) : BossAI(creature, DATA_MANDOKIR) { }
void Reset()
{
- _Reset();
- killCount = 0;
+ if (me->GetPositionZ() > 140.0f)
+ {
+ _Reset();
+ killCount = 0;
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
+ events.ScheduleEvent(EVENT_CHECK_START, 1000);
+ if (Creature* speaker = Creature::GetCreature(*me, instance->GetData64(NPC_VILEBRANCH_SPEAKER)))
+ if (!speaker->isAlive())
+ speaker->Respawn(true);
+ }
+ summons.DespawnAll();
me->Mount(MODEL_OHGAN_MOUNT);
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
- events.ScheduleEvent(EVENT_CHECK_START, 1000);
}
void JustDied(Unit* /*killer*/)
{
- _JustDied();
- }
-
- void Evade(Unit* /*killer*/)
- {
-
+ // Do not want to unsummon Ohgan
+ for (int i = 0; i < CHAINED_SPIRT_COUNT; ++i)
+ if (Creature* unsummon = Creature::GetCreature(*me, chainedSpirtGUIDs[i]))
+ unsummon->DespawnOrUnsummon();
+ instance->SetBossState(DATA_MANDOKIR, DONE);
+ instance->SaveToDB();
}
void EnterCombat(Unit* /*who*/)
@@ -129,39 +146,57 @@ class boss_mandokir : public CreatureScript
events.ScheduleEvent(EVENT_WHIRLWIND, urand(24000, 30000));
events.ScheduleEvent(EVENT_CHECK_OHGAN, 1000);
events.ScheduleEvent(EVENT_WATCH_PLAYER, urand(13000, 15000));
- me->SetSpeed(MOVE_RUN, false);
- me->GetMotionMaster()->Clear(true);
+ events.ScheduleEvent(EVENT_CHARGE_PLAYER, urand(33000, 38000));
+ me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
Talk(SAY_AGGRO);
me->Dismount();
// Summon Ohgan (Spell missing) TEMP HACK
- me->SummonCreature(NPC_OHGAN, me->getVictim()->GetPositionX(), me->getVictim()->GetPositionY(), me->getVictim()->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 35000);
+ me->SummonCreature(NPC_OHGAN, me->GetPositionX()-3, me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 35000);
+ // Summon Chained Spirits
for (int i = 0; i < CHAINED_SPIRT_COUNT; ++i)
- me->SummonCreature(NPC_CHAINED_SPIRT, PosSummonChainedSpirits[i], TEMPSUMMON_CORPSE_DESPAWN);
+ {
+ Creature* chainedSpirt = me->SummonCreature(NPC_CHAINED_SPIRT, PosSummonChainedSpirits[i], TEMPSUMMON_CORPSE_DESPAWN);
+ chainedSpirtGUIDs[i] = chainedSpirt->GetGUID();
+ }
+ DoZoneInCombat();
}
void KilledUnit(Unit* victim)
{
- if (victim->GetTypeId() == TYPEID_PLAYER)
+ if (victim->GetTypeId() != TYPEID_PLAYER)
+ return;
+
+ if (++killCount == 3)
+ {
+ Talk(SAY_DING_KILL);
+ if (Creature* jindo = Creature::GetCreature(*me, instance->GetData64(DATA_JINDO)))
+ if (jindo->isAlive())
+ jindo->AI()->Talk(SAY_GRATS_JINDO);
+ DoCast(me, SPELL_LEVEL_UP, true);
+ killCount = 0;
+ }
+ }
+
+ void MovementInform(uint32 type, uint32 id)
+ {
+ if (type == WAYPOINT_MOTION_TYPE)
{
- if (++killCount == 3 && instance)
+ me->SetWalk(false);
+ if (id == POINT_MANDOKIR_END)
{
- Talk(SAY_DING_KILL);
- if (uint64 JindoGUID = instance->GetData64(DATA_JINDO))
- if (Creature* jTemp = Creature::GetCreature(*me, JindoGUID))
- if (jTemp->isAlive())
- jTemp->AI()->Talk(SAY_GRATS_JINDO);
- DoCast(me, SPELL_LEVEL_UP, true);
- killCount = 0;
+ me->SetHomePosition(PosMandokir[0]);
+ instance->SetBossState(DATA_MANDOKIR, NOT_STARTED);
+ me->DespawnOrUnsummon(6000); // No idea how to respawn on wipe.
}
}
}
void UpdateAI(uint32 const diff)
{
-
events.Update(diff);
if (!UpdateVictim())
+ {
if (instance->GetBossState(DATA_MANDOKIR) == NOT_STARTED || instance->GetBossState(DATA_MANDOKIR) == SPECIAL)
{
while (uint32 eventId = events.ExecuteEvent())
@@ -169,20 +204,17 @@ class boss_mandokir : public CreatureScript
switch (eventId)
{
case EVENT_CHECK_START:
- if(instance)
- if (instance->GetBossState(DATA_MANDOKIR) == SPECIAL)
- {
- me->SetSpeed(MOVE_RUN, true);
- me->GetMotionMaster()->MovePoint(0, -12197.86f, -1949.392f, 130.2745f);
- events.ScheduleEvent(EVENT_STARTED, 3000);
- }
- else
- events.ScheduleEvent(EVENT_CHECK_START, 1000);
+ if (instance->GetBossState(DATA_MANDOKIR) == SPECIAL)
+ {
+ me->GetMotionMaster()->MovePoint(0, PosMandokir[1].m_positionX, PosMandokir[1].m_positionY, PosMandokir[1].m_positionZ);
+ events.ScheduleEvent(EVENT_STARTED, 6000);
+ }
+ else
+ events.ScheduleEvent(EVENT_CHECK_START, 1000);
break;
case EVENT_STARTED:
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
- me->SetReactState(REACT_AGGRESSIVE);
- me->GetMotionMaster()->MovePath(PATH_MANDOKIR,false);
+ me->GetMotionMaster()->MovePath(PATH_MANDOKIR, false);
break;
default:
break;
@@ -190,6 +222,7 @@ class boss_mandokir : public CreatureScript
}
}
return;
+ }
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
@@ -212,24 +245,26 @@ class boss_mandokir : public CreatureScript
events.ScheduleEvent(EVENT_WHIRLWIND, urand(22000, 26000));
break;
case EVENT_CHECK_OHGAN:
- if (instance)
- if (instance->GetBossState(DATA_OHGAN) == DONE)
- {
- DoCast(me, SPELL_FRENZY);
- Talk(SAY_OHGAN_DEAD);
- }
- else
- events.ScheduleEvent(EVENT_CHECK_OHGAN, 1000);
+ if (instance->GetBossState(DATA_OHGAN) == DONE)
+ {
+ DoCast(me, SPELL_FRENZY);
+ Talk(SAY_OHGAN_DEAD);
+ }
+ else
+ events.ScheduleEvent(EVENT_CHECK_OHGAN, 1000);
break;
case EVENT_WATCH_PLAYER:
- if (Unit* player = SelectTarget(SELECT_TARGET_RANDOM, 0, 40, true))
+ if (Unit* player = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
{
DoCast(player, SPELL_WATCH);
Talk(SAY_WATCH, player->GetGUID());
- // Not complete
}
events.ScheduleEvent(EVENT_WATCH_PLAYER, urand(12000, 15000));
break;
+ case EVENT_CHARGE_PLAYER:
+ DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 40, true), SPELL_CHARGE);
+ events.ScheduleEvent(EVENT_CHARGE_PLAYER, urand(22000, 30000));
+ break;
default:
break;
}
@@ -237,17 +272,21 @@ class boss_mandokir : public CreatureScript
DoMeleeAttackIfReady();
}
+
+ private:
+ uint8 killCount;
+ uint64 chainedSpirtGUIDs[CHAINED_SPIRT_COUNT];
};
CreatureAI* GetAI(Creature* creature) const
{
- return new boss_mandokirAI(creature);
+ return GetZulGurubAI<boss_mandokirAI>(creature);
}
};
// Ohgan
-enum O_Spells
+enum OhganSpells
{
SPELL_SUNDERARMOR = 24317
};
@@ -258,13 +297,7 @@ class mob_ohgan : public CreatureScript
struct mob_ohganAI : public ScriptedAI
{
- mob_ohganAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = me->GetInstanceScript();
- }
-
- uint32 SunderArmor_Timer;
- InstanceScript* instance;
+ mob_ohganAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { }
void Reset()
{
@@ -275,17 +308,15 @@ class mob_ohgan : public CreatureScript
void JustDied(Unit* /*killer*/)
{
- if (instance)
- instance->SetBossState(DATA_OHGAN, DONE);
+ instance->SetBossState(DATA_OHGAN, DONE);
}
- void UpdateAI (const uint32 diff)
+ void UpdateAI(const uint32 diff)
{
- //Return since we have no target
+ // Return since we have no target
if (!UpdateVictim())
return;
- //SunderArmor_Timer
if (SunderArmor_Timer <= diff)
{
DoCastVictim(SPELL_SUNDERARMOR, true);
@@ -294,17 +325,19 @@ class mob_ohgan : public CreatureScript
DoMeleeAttackIfReady();
}
+
+ private:
+ uint32 SunderArmor_Timer;
+ InstanceScript* instance;
};
CreatureAI* GetAI(Creature* creature) const
{
- return new mob_ohganAI(creature);
+ return GetZulGurubAI<mob_ohganAI>(creature);
}
};
-// Vilebranch Speaker
-
-enum VS_Spells
+enum VilebranchSpells
{
SPELL_DEMORALIZING_SHOUT = 13730,
SPELL_CLEAVE = 15284
@@ -316,14 +349,7 @@ class mob_vilebranch_speaker : public CreatureScript
struct mob_vilebranch_speakerAI : public ScriptedAI
{
- mob_vilebranch_speakerAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = me->GetInstanceScript();
- }
-
- uint32 demoralizing_Shout_Timer;
- uint32 cleave_Timer;
- InstanceScript* instance;
+ mob_vilebranch_speakerAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { }
void Reset()
{
@@ -335,24 +361,21 @@ class mob_vilebranch_speaker : public CreatureScript
void JustDied(Unit* /*killer*/)
{
- if (instance)
- instance->SetBossState(DATA_MANDOKIR, SPECIAL);
+ instance->SetBossState(DATA_MANDOKIR, SPECIAL);
}
- void UpdateAI (const uint32 diff)
+ void UpdateAI(const uint32 diff)
{
// Return since we have no target
if (!UpdateVictim())
return;
- // demoralizing_Shout_Timer
if (demoralizing_Shout_Timer <= diff)
{
DoCast(me, SPELL_DEMORALIZING_SHOUT);
demoralizing_Shout_Timer = urand(22000, 30000);
} else demoralizing_Shout_Timer -= diff;
- // cleave_Timer
if (cleave_Timer <= diff)
{
DoCastVictim(SPELL_CLEAVE, true);
@@ -361,6 +384,11 @@ class mob_vilebranch_speaker : public CreatureScript
DoMeleeAttackIfReady();
}
+
+ private:
+ uint32 demoralizing_Shout_Timer;
+ uint32 cleave_Timer;
+ InstanceScript* instance;
};
CreatureAI* GetAI(Creature* creature) const
@@ -369,9 +397,39 @@ class mob_vilebranch_speaker : public CreatureScript
}
};
+class spell_threatening_gaze : public SpellScriptLoader
+{
+ public:
+ spell_threatening_gaze() : SpellScriptLoader("spell_threatening_gaze") { }
+
+ class spell_threatening_gaze_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_threatening_gaze_AuraScript);
+
+ void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (Unit* caster = GetCaster())
+ if(Unit* target = GetTarget())
+ if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE && GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEATH)
+ caster->CastSpell(target, SPELL_WATCH_CHARGE);
+ }
+
+ void Register()
+ {
+ OnEffectRemove += AuraEffectRemoveFn(spell_threatening_gaze_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_threatening_gaze_AuraScript();
+ }
+};
+
void AddSC_boss_mandokir()
{
new boss_mandokir();
new mob_ohgan();
new mob_vilebranch_speaker();
+ new spell_threatening_gaze();
}
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp
index 48f1377da80..19a2ba39578 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp
@@ -29,7 +29,7 @@ EndScriptData */
class instance_zulgurub : public InstanceMapScript
{
- public: instance_zulgurub(): InstanceMapScript("instance_zulgurub", 309) {}
+ public: instance_zulgurub(): InstanceMapScript(ZGScriptName, 309) {}
struct instance_zulgurub_InstanceMapScript : public InstanceScript
{
@@ -38,25 +38,18 @@ class instance_zulgurub : public InstanceMapScript
SetBossNumber(EncounterCount);
}
- //If all High Priest bosses were killed. Lorkhan, Zath and Ohgan are added too.
- //Storing Lorkhan, Zath and Thekal because we need to cast on them later. Jindo is needed for healfunction too.
-
- uint64 lorKhanGUID;
- uint64 zathGUID;
- uint64 thekalGUID;
- uint64 jindoGUID;
-
void Initialize()
{
- lorKhanGUID = 0;
- zathGUID = 0;
- thekalGUID = 0;
- jindoGUID = 0;
+ ZealotLorkhanGUID = 0;
+ ZealotZathGUID = 0;
+ HighPriestTekalGUID = 0;
+ JindoTheHexxerGUID = 0;
+ VilebranchSpeakerGUID = 0;
}
bool IsEncounterInProgress() const
{
- //not active in Zul'Gurub
+ // not active in Zul'Gurub
return false;
}
@@ -64,10 +57,25 @@ class instance_zulgurub : public InstanceMapScript
{
switch (creature->GetEntry())
{
- case NPC_ZEALOT_LORKHAN: lorKhanGUID = creature->GetGUID(); break;
- case NPC_ZEALOT_ZATH: zathGUID = creature->GetGUID(); break;
- case NPC_HIGH_PRIEST_THEKAL: thekalGUID = creature->GetGUID(); break;
- case NPC_JINDO_THE_HEXXER: jindoGUID = creature->GetGUID(); break;
+ case NPC_ZEALOT_LORKHAN:
+ ZealotLorkhanGUID = creature->GetGUID();
+ break;
+ case NPC_ZEALOT_ZATH:
+ ZealotZathGUID = creature->GetGUID();
+ break;
+ case NPC_HIGH_PRIEST_THEKAL:
+ HighPriestTekalGUID = creature->GetGUID();
+ break;
+ case NPC_JINDO_THE_HEXXER:
+ JindoTheHexxerGUID = creature->GetGUID();
+ break;
+ case NPC_VILEBRANCH_SPEAKER:
+ VilebranchSpeakerGUID = creature->GetGUID();
+ break;
+ case NPC_MANDOKIR:
+ if (GetBossState(DATA_MANDOKIR) == DONE)
+ creature->DespawnOrUnsummon();
+ break;
}
}
@@ -75,10 +83,18 @@ class instance_zulgurub : public InstanceMapScript
{
switch (uiData)
{
- case DATA_LORKHAN: return lorKhanGUID;
- case DATA_ZATH: return zathGUID;
- case DATA_THEKAL: return thekalGUID;
- case DATA_JINDO: return jindoGUID;
+ case DATA_LORKHAN:
+ return ZealotLorkhanGUID;
+ break;
+ case DATA_ZATH:
+ return ZealotZathGUID;
+ break;
+ case DATA_THEKAL:
+ return HighPriestTekalGUID;
+ break;
+ case DATA_JINDO:
+ return JindoTheHexxerGUID;
+ break;
}
return 0;
}
@@ -125,6 +141,15 @@ class instance_zulgurub : public InstanceMapScript
OUT_LOAD_INST_DATA_COMPLETE;
}
+ private:
+ //If all High Priest bosses were killed. Lorkhan, Zath and Ohgan are added too.
+ //Storing Lorkhan, Zath and Thekal because we need to cast on them later. Jindo is needed for healfunction too.
+
+ uint64 ZealotLorkhanGUID;
+ uint64 ZealotZathGUID;
+ uint64 HighPriestTekalGUID;
+ uint64 JindoTheHexxerGUID;
+ uint64 VilebranchSpeakerGUID;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
index 5871a203b00..34680447cd7 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h
@@ -20,6 +20,8 @@
uint32 const EncounterCount = 13;
+#define ZGScriptName "instance_zulgurub"
+
enum DataTypes
{
DATA_JEKLIK = 0, // Main boss
@@ -45,11 +47,22 @@ enum CreatureIds
NPC_JINDO_THE_HEXXER = 11380,
NPC_NIGHTMARE_ILLUSION = 15163,
NPC_ZULIAN_PROWLER = 15101,
- NPC_SPEAKER = 11391,
+ NPC_VILEBRANCH_SPEAKER = 11391,
NPC_SHADE_OF_JINDO = 14986,
NPC_SACRIFICED_TROLL = 14826,
NPC_OHGAN = 14988,
- NPC_CHAINED_SPIRT = 15117
+ NPC_CHAINED_SPIRT = 15117,
+ NPC_MANDOKIR = 11382
};
+template<class AI>
+CreatureAI* GetZulGurubAI(Creature* creature)
+{
+ if (InstanceMap* instance = creature->GetMap()->ToInstanceMap())
+ if (instance->GetInstanceScript())
+ if (instance->GetScriptId() == sObjectMgr->GetScriptId(ZGScriptName))
+ return new AI(creature);
+ return NULL;
+}
+
#endif