From ace7bbeddf30a4d83df7500bce93348b63edbb6e Mon Sep 17 00:00:00 2001 From: Malcrom Date: Wed, 16 Jan 2013 00:41:03 -0330 Subject: Core/Zul'Grub: Fix up Mandokir Boss --- .../EasternKingdoms/ZulGurub/boss_mandokir.cpp | 128 ++++++++++++++++----- .../EasternKingdoms/ZulGurub/instance_zulgurub.cpp | 41 +++++-- .../scripts/EasternKingdoms/ZulGurub/zulgurub.h | 3 +- 3 files changed, 135 insertions(+), 37 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp index acfa38e542d..195a3b198f6 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp @@ -25,6 +25,7 @@ EndScriptData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "Spell.h" #include "zulgurub.h" enum Says @@ -52,19 +53,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,6 +96,12 @@ 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") {} @@ -101,24 +111,35 @@ class boss_mandokir : public CreatureScript boss_mandokirAI(Creature* creature) : BossAI(creature, DATA_MANDOKIR) {} uint8 killCount; + uint64 chainedSpirtGUIDs[CHAINED_SPIRT_COUNT]; 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 (uint64 speakerGUID = instance->GetData64(NPC_SPEAKER)) + if (Creature* speaker = Creature::GetCreature(*me, NPC_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,14 +150,20 @@ 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 = NULL; + chainedSpirt = me->SummonCreature(NPC_CHAINED_SPIRT, PosSummonChainedSpirits[i], TEMPSUMMON_CORPSE_DESPAWN); + chainedSpirtGUIDs[i] = chainedSpirt->GetGUID(); + } + DoZoneInCombat(); } void KilledUnit(Unit* victim) @@ -156,9 +183,23 @@ class boss_mandokir : public CreatureScript } } - void UpdateAI(uint32 const diff) + void MovementInform(uint32 type, uint32 id) { + if (type == WAYPOINT_MOTION_TYPE) + { + me->SetWalk(false); + if (id == POINT_MANDOKIR_END) + { + me->SetHomePosition(PosMandokir[0]); + if (instance) + 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()) @@ -172,16 +213,14 @@ class boss_mandokir : public CreatureScript 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); + 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); break; default: @@ -222,14 +261,17 @@ class boss_mandokir : public CreatureScript 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; } @@ -369,9 +411,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..04af601868e 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp @@ -45,6 +45,7 @@ class instance_zulgurub : public InstanceMapScript uint64 zathGUID; uint64 thekalGUID; uint64 jindoGUID; + uint64 speakerGUID; void Initialize() { @@ -52,6 +53,7 @@ class instance_zulgurub : public InstanceMapScript zathGUID = 0; thekalGUID = 0; jindoGUID = 0; + speakerGUID = 0; } bool IsEncounterInProgress() const @@ -64,10 +66,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: + 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_SPEAKER: + speakerGUID = creature->GetGUID(); + break; + case NPC_MANDOKIR: + if (GetBossState(DATA_MANDOKIR) == DONE) + creature->DespawnOrUnsummon(); + break; } } @@ -75,10 +92,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 lorKhanGUID; + break; + case DATA_ZATH: + return zathGUID; + break; + case DATA_THEKAL: + return thekalGUID; + break; + case DATA_JINDO: + return jindoGUID; + break; } return 0; } diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h index 5871a203b00..a5e23dc2e3f 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h +++ b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h @@ -49,7 +49,8 @@ enum CreatureIds NPC_SHADE_OF_JINDO = 14986, NPC_SACRIFICED_TROLL = 14826, NPC_OHGAN = 14988, - NPC_CHAINED_SPIRT = 15117 + NPC_CHAINED_SPIRT = 15117, + NPC_MANDOKIR = 11382 }; #endif -- cgit v1.2.3 From 803bf2f9cc1fa5f23d51d3d5c9f93b0fd49d0109 Mon Sep 17 00:00:00 2001 From: Warpten Date: Wed, 16 Jan 2013 06:51:59 +0100 Subject: Scripts/ZulGurub: * Fixed non-PCH compile. * Changed some codestyle on Mandokir. * Fixed compile warnings and a few typos. * Remove instance checks and use a wrapper to get AIs. --- .../EasternKingdoms/ZulGurub/boss_mandokir.cpp | 123 +++++++++------------ .../EasternKingdoms/ZulGurub/instance_zulgurub.cpp | 2 +- .../scripts/EasternKingdoms/ZulGurub/zulgurub.h | 14 ++- 3 files changed, 69 insertions(+), 70 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp index 195a3b198f6..0a8b280de5b 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp @@ -23,10 +23,12 @@ SDComment: Ohgan function needs improvements. SDCategory: Zul'Gurub EndScriptData */ +#include "zulgurub.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "Spell.h" -#include "zulgurub.h" +#include "SpellAuras.h" +#include "SpellScript.h" enum Says { @@ -108,10 +110,7 @@ class boss_mandokir : public CreatureScript struct boss_mandokirAI : public BossAI { - boss_mandokirAI(Creature* creature) : BossAI(creature, DATA_MANDOKIR) {} - - uint8 killCount; - uint64 chainedSpirtGUIDs[CHAINED_SPIRT_COUNT]; + boss_mandokirAI(Creature* creature) : BossAI(creature, DATA_MANDOKIR) { } void Reset() { @@ -121,10 +120,9 @@ class boss_mandokir : public CreatureScript killCount = 0; me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); events.ScheduleEvent(EVENT_CHECK_START, 1000); - if (uint64 speakerGUID = instance->GetData64(NPC_SPEAKER)) - if (Creature* speaker = Creature::GetCreature(*me, NPC_SPEAKER)) - if (!speaker->isAlive()) - speaker->Respawn(true); + if (Creature* speaker = Creature::GetCreature(*me, instance->GetData64(NPC_VILEBRANCH_SPEAKER))) + if (!speaker->isAlive()) + speaker->Respawn(true); } summons.DespawnAll(); me->Mount(MODEL_OHGAN_MOUNT); @@ -134,10 +132,8 @@ class boss_mandokir : public CreatureScript { // 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(); } @@ -159,8 +155,7 @@ class boss_mandokir : public CreatureScript // Summon Chained Spirits for (int i = 0; i < CHAINED_SPIRT_COUNT; ++i) { - Creature* chainedSpirt = NULL; - chainedSpirt = 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(); @@ -168,18 +163,17 @@ class boss_mandokir : public CreatureScript void KilledUnit(Unit* victim) { - if (victim->GetTypeId() == TYPEID_PLAYER) + if (victim->GetTypeId() != TYPEID_PLAYER) + return; + + if (++killCount == 3) { - if (++killCount == 3 && instance) - { - 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; - } + 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; } } @@ -191,8 +185,7 @@ class boss_mandokir : public CreatureScript if (id == POINT_MANDOKIR_END) { me->SetHomePosition(PosMandokir[0]); - if (instance) - instance->SetBossState(DATA_MANDOKIR, NOT_STARTED); + instance->SetBossState(DATA_MANDOKIR, NOT_STARTED); me->DespawnOrUnsummon(6000); // No idea how to respawn on wipe. } } @@ -203,6 +196,7 @@ class boss_mandokir : public CreatureScript events.Update(diff); if (!UpdateVictim()) + { if (instance->GetBossState(DATA_MANDOKIR) == NOT_STARTED || instance->GetBossState(DATA_MANDOKIR) == SPECIAL) { while (uint32 eventId = events.ExecuteEvent()) @@ -221,7 +215,7 @@ class boss_mandokir : public CreatureScript break; case EVENT_STARTED: me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC); - me->GetMotionMaster()->MovePath(PATH_MANDOKIR,false); + me->GetMotionMaster()->MovePath(PATH_MANDOKIR, false); break; default: break; @@ -229,6 +223,7 @@ class boss_mandokir : public CreatureScript } } return; + } if (me->HasUnitState(UNIT_STATE_CASTING)) return; @@ -251,14 +246,13 @@ 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, 100, true)) @@ -269,8 +263,8 @@ class boss_mandokir : public CreatureScript 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)); + DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0, 40, true), SPELL_CHARGE); + events.ScheduleEvent(EVENT_CHARGE_PLAYER, urand(22000, 30000)); break; default: break; @@ -279,17 +273,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(creature); } }; // Ohgan -enum O_Spells +enum OhganSpells { SPELL_SUNDERARMOR = 24317 }; @@ -300,13 +298,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() { @@ -317,17 +309,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); @@ -336,17 +326,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(creature); } }; -// Vilebranch Speaker - -enum VS_Spells +enum VilebranchSpells { SPELL_DEMORALIZING_SHOUT = 13730, SPELL_CLEAVE = 15284 @@ -358,14 +350,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() { @@ -377,24 +362,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); @@ -403,6 +385,11 @@ class mob_vilebranch_speaker : public CreatureScript DoMeleeAttackIfReady(); } + + private: + uint32 demoralizing_Shout_Timer; + uint32 cleave_Timer; + InstanceScript* instance; }; CreatureAI* GetAI(Creature* creature) const diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp index 04af601868e..2e8bfd621b9 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 { diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h index a5e23dc2e3f..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,7 +47,7 @@ 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, @@ -53,4 +55,14 @@ enum CreatureIds NPC_MANDOKIR = 11382 }; +template +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 -- cgit v1.2.3 From 26bf10365e5addc4b1efea883dd2239ebf361068 Mon Sep 17 00:00:00 2001 From: Warpten Date: Wed, 16 Jan 2013 06:55:46 +0100 Subject: Scripts/ZulGurub: Forgotten change to previous commit. Damned Ctrl+S. --- .../scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp index 0a8b280de5b..b4edc6553e6 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp @@ -204,14 +204,13 @@ class boss_mandokir : public CreatureScript switch (eventId) { case EVENT_CHECK_START: - if(instance) - 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); + 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); -- cgit v1.2.3 From 797be8d9ffe9c4c3556344a3f05a5feca230d3ae Mon Sep 17 00:00:00 2001 From: Warpten Date: Wed, 16 Jan 2013 07:07:48 +0100 Subject: Scripts/ZulGurub: Missing mass replace changes and typo/codestyle fixes. --- .../EasternKingdoms/ZulGurub/boss_arlokk.cpp | 56 +++++++++++----------- .../EasternKingdoms/ZulGurub/boss_mandokir.cpp | 2 +- .../EasternKingdoms/ZulGurub/instance_zulgurub.cpp | 50 +++++++++---------- 3 files changed, 55 insertions(+), 53 deletions(-) (limited to 'src/server/scripts') 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(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_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp index b4edc6553e6..e402480609b 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp @@ -23,12 +23,12 @@ SDComment: Ohgan function needs improvements. SDCategory: Zul'Gurub EndScriptData */ -#include "zulgurub.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "Spell.h" #include "SpellAuras.h" #include "SpellScript.h" +#include "zulgurub.h" enum Says { diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp index 2e8bfd621b9..fbe8550d16a 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp @@ -38,27 +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; - uint64 speakerGUID; - void Initialize() { - lorKhanGUID = 0; - zathGUID = 0; - thekalGUID = 0; - jindoGUID = 0; - speakerGUID = 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; } @@ -67,19 +58,19 @@ class instance_zulgurub : public InstanceMapScript switch (creature->GetEntry()) { case NPC_ZEALOT_LORKHAN: - lorKhanGUID = creature->GetGUID(); + ZealotLorkhanGUID = creature->GetGUID(); break; case NPC_ZEALOT_ZATH: - zathGUID = creature->GetGUID(); + ZealotZathGUID = creature->GetGUID(); break; case NPC_HIGH_PRIEST_THEKAL: - thekalGUID = creature->GetGUID(); + HighPriestTekalGUID = creature->GetGUID(); break; case NPC_JINDO_THE_HEXXER: - jindoGUID = creature->GetGUID(); + JindoTheHexxerGUID = creature->GetGUID(); break; - case NPC_SPEAKER: - speakerGUID = creature->GetGUID(); + case NPC_VILEBRANCH_SPEAKER: + VilebranchSpeakerGUID = creature->GetGUID(); break; case NPC_MANDOKIR: if (GetBossState(DATA_MANDOKIR) == DONE) @@ -93,16 +84,16 @@ class instance_zulgurub : public InstanceMapScript switch (uiData) { case DATA_LORKHAN: - return lorKhanGUID; + return ZealotLorkhanGUID; break; case DATA_ZATH: - return zathGUID; + return ZealotZathGUID; break; case DATA_THEKAL: - return thekalGUID; + return HighPriestTekalGUID; break; case DATA_JINDO: - return jindoGUID; + return JindoTheHexxerGUID; break; } return 0; @@ -150,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 -- cgit v1.2.3 From 3df4075a04079f019e2b90f18454990cd681d6e5 Mon Sep 17 00:00:00 2001 From: Warpten Date: Wed, 16 Jan 2013 07:16:22 +0100 Subject: Scripts/ZulGurub: Fixed Hakkar's aspects. --- src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src/server/scripts') 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); } -- cgit v1.2.3 From faccbef86903c1cfc26aeeedc7938a1563e9be4e Mon Sep 17 00:00:00 2001 From: Warpten Date: Wed, 16 Jan 2013 07:18:47 +0100 Subject: Scripts/ZulGurub: I can do this! Commiting stuff one hour after waking up is no good. --- src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/server/scripts') diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp index fbe8550d16a..19a2ba39578 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp @@ -149,7 +149,7 @@ class instance_zulgurub : public InstanceMapScript uint64 ZealotZathGUID; uint64 HighPriestTekalGUID; uint64 JindoTheHexxerGUID; - uint64 VilebranchSpeakerGUID + uint64 VilebranchSpeakerGUID; }; InstanceScript* GetInstanceScript(InstanceMap* map) const -- cgit v1.2.3