diff options
Diffstat (limited to 'src/server/scripts')
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 |
