diff options
author | ccrs <ccrs@users.noreply.github.com> | 2019-06-05 21:43:55 +0200 |
---|---|---|
committer | ccrs <ccrs@users.noreply.github.com> | 2019-06-05 21:43:55 +0200 |
commit | 7b2defe5a0e645ab88e48df2d8e5417e4977d41c (patch) | |
tree | ef928305c4f28c9b7ac90050ec05ccf3e31440cf /src | |
parent | 91028d98a3c260d24d33018ca9a7f05da76ff7e7 (diff) |
Scripts/ZulGurub: general instance related refactoring/updating
plus couple event-spells-ai related corrections
plus codestyle cleanup
Diffstat (limited to 'src')
16 files changed, 429 insertions, 559 deletions
diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp index 7e0674cfda3..36b1572cb28 100644 --- a/src/server/game/Handlers/GroupHandler.cpp +++ b/src/server/game/Handlers/GroupHandler.cpp @@ -449,7 +449,7 @@ void WorldSession::HandleLootMethodOpcode(WorldPacket& recvData) if (group->isLFGGroup()) return; - + if (lootMethod > NEED_BEFORE_GREED) return; diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp index 32863b5e29f..ac29e5f5a1b 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp @@ -15,24 +15,15 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* ScriptData -TCName: Boss_Arlokk -TC%Complete: 95 -TCComment: Wrong cleave and red aura is missing not yet added. -TCComment: Prowlers moving through wall hopefully mmaps will fix. -TCComment: Can't test LOS until mmaps. -TCCategory: Zul'Gurub -EndScriptData */ - -#include "ScriptMgr.h" +#include "zulgurub.h" #include "GameObject.h" #include "GameObjectAI.h" #include "InstanceScript.h" -#include "ObjectAccessor.h" #include "MotionMaster.h" +#include "ObjectAccessor.h" #include "ScriptedCreature.h" +#include "ScriptMgr.h" #include "SpellInfo.h" -#include "zulgurub.h" enum Says { @@ -172,7 +163,7 @@ class boss_arlokk : public CreatureScript void EnterEvadeMode(EvadeReason why) override { BossAI::EnterEvadeMode(why); - if (GameObject* object = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_GONG_OF_BETHEKK))) + if (GameObject* object = instance->GetGameObject(DATA_GONG_BETHEKK)) object->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); me->DespawnOrUnsummon(4000); } @@ -370,8 +361,10 @@ class npc_zulian_prowler : public CreatureScript DoCast(me, SPELL_SNEAK_RANK_1_1); DoCast(me, SPELL_SNEAK_RANK_1_2); - if (Unit* arlokk = ObjectAccessor::GetUnit(*me, _instance->GetGuidData(NPC_ARLOKK))) - me->GetMotionMaster()->MovePoint(0, arlokk->GetPositionX(), arlokk->GetPositionY(), arlokk->GetPositionZ()); + if (Creature* arlokk = _instance->GetCreature(DATA_ARLOKK)) + if (arlokk->IsAlive()) + me->GetMotionMaster()->MovePoint(0, arlokk->GetPosition()); + _events.ScheduleEvent(EVENT_ATTACK, 6s); } @@ -390,7 +383,7 @@ class npc_zulian_prowler : public CreatureScript void JustDied(Unit* /*killer*/) override { - if (Unit* arlokk = ObjectAccessor::GetUnit(*me, _instance->GetGuidData(NPC_ARLOKK))) + if (Creature* arlokk = _instance->GetCreature(DATA_ARLOKK)) { if (arlokk->IsAlive()) arlokk->GetAI()->SetData(_sideData, 0); diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp index 91918ab2f69..bc3b2678d49 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp @@ -16,29 +16,22 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* ScriptData -SDName: Boss_Gahz'ranka -SD%Complete: 85 -SDComment: Massive Geyser with knockback not working. Spell buggy. -SDCategory: Zul'Gurub -EndScriptData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" #include "zulgurub.h" +#include "ScriptedCreature.h" +#include "ScriptMgr.h" enum Spells { - SPELL_FROSTBREATH = 16099, - SPELL_MASSIVEGEYSER = 22421, // Not working. (summon) - SPELL_SLAM = 24326 + SPELL_FROSTBREATH = 16099, + SPELL_MASSIVEGEYSER = 22421, // Not working. (summon) + SPELL_SLAM = 24326 }; enum Events { - EVENT_FROSTBREATH = 1, - EVENT_MASSIVEGEYSER = 2, - EVENT_SLAM = 3 + EVENT_FROSTBREATH = 1, + EVENT_MASSIVEGEYSER = 2, + EVENT_SLAM = 3 }; class boss_gahzranka : public CreatureScript // gahzranka diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp index eff1ed08954..be9aa5b55bd 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp @@ -16,27 +16,20 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* ScriptData -SDName: Boss_Grilek -SD%Complete: 100 -SDComment: -SDCategory: Zul'Gurub -EndScriptData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" #include "zulgurub.h" +#include "ScriptedCreature.h" +#include "ScriptMgr.h" enum Spells { - SPELL_AVATAR = 24646, // Enrage Spell - SPELL_GROUND_TREMOR = 6524 + SPELL_AVATAR = 24646, // Enrage Spell + SPELL_GROUND_TREMOR = 6524 }; enum Events { - EVENT_AVATAR = 1, - EVENT_GROUND_TREMOR = 2 + EVENT_AVATAR = 1, + EVENT_GROUND_TREMOR = 2 }; class boss_grilek : public CreatureScript // grilek diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp index edf618eb10d..0ca52584c76 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp @@ -15,17 +15,10 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* -Name: Boss_Hakkar -%Complete: 95 -Comment: Blood siphon spell buggy cause of Core Issue. -Category: Zul'Gurub -*/ - -#include "ScriptMgr.h" +#include "zulgurub.h" #include "InstanceScript.h" #include "ScriptedCreature.h" -#include "zulgurub.h" +#include "ScriptMgr.h" enum Says { @@ -42,6 +35,7 @@ enum Spells SPELL_CAUSE_INSANITY = 24327, // Spell needs scripting. SPELL_WILL_OF_HAKKAR = 24178, SPELL_ENRAGE = 24318, + // The Aspects of all High Priests spells SPELL_ASPECT_OF_JEKLIK = 24687, SPELL_ASPECT_OF_VENOXIS = 24688, @@ -57,6 +51,7 @@ enum Events EVENT_CAUSE_INSANITY = 3, // Spell needs scripting. Event disabled EVENT_WILL_OF_HAKKAR = 4, EVENT_ENRAGE = 5, + // The Aspects of all High Priests events EVENT_ASPECT_OF_JEKLIK = 6, EVENT_ASPECT_OF_VENOXIS = 7, diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp index d80fcb2a344..9a19af2760f 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp @@ -16,29 +16,22 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* ScriptData -SDName: Boss_Hazzarah -SD%Complete: 100 -SDComment: -SDCategory: Zul'Gurub -EndScriptData */ - -#include "ScriptMgr.h" +#include "zulgurub.h" #include "ScriptedCreature.h" +#include "ScriptMgr.h" #include "TemporarySummon.h" -#include "zulgurub.h" enum Spells { - SPELL_MANABURN = 26046, - SPELL_SLEEP = 24664 + SPELL_MANABURN = 26046, + SPELL_SLEEP = 24664 }; enum Events { - EVENT_MANABURN = 1, - EVENT_SLEEP = 2, - EVENT_ILLUSIONS = 3 + EVENT_MANABURN = 1, + EVENT_SLEEP = 2, + EVENT_ILLUSIONS = 3 }; class boss_hazzarah : public CreatureScript @@ -95,9 +88,9 @@ class boss_hazzarah : public CreatureScript // We will just use one model for the beginning for (uint8 i = 0; i < 3; ++i) { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - if (Creature* Illusion = me->SummonCreature(NPC_NIGHTMARE_ILLUSION, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000)) - Illusion->AI()->AttackStart(target); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.f, true)) + if (TempSummon* illusion = me->SummonCreature(NPC_NIGHTMARE_ILLUSION, target->GetPosition(), TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000)) + illusion->AI()->AttackStart(target); } events.ScheduleEvent(EVENT_ILLUSIONS, 15s, 25s); break; diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp index 9a174d02efc..92dc0c2ffff 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp @@ -15,42 +15,42 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include "ScriptMgr.h" +#include "zulgurub.h" #include "ScriptedCreature.h" +#include "ScriptMgr.h" #include "TemporarySummon.h" -#include "zulgurub.h" enum Says { - SAY_AGGRO = 0, - SAY_RAIN_FIRE = 1, - SAY_DEATH = 2 + SAY_AGGRO = 0, + SAY_RAIN_FIRE = 1, + SAY_DEATH = 2 }; enum Spells { - SPELL_CHARGE = 22911, - SPELL_SONICBURST = 23918, - SPELL_SCREECH = 6605, - SPELL_SHADOW_WORD_PAIN = 23952, - SPELL_MIND_FLAY = 23953, - SPELL_CHAIN_MIND_FLAY = 26044, // Right ID unknown. So disabled - SPELL_GREATERHEAL = 23954, - SPELL_BAT_FORM = 23966, + SPELL_CHARGE = 22911, + SPELL_SONICBURST = 23918, + SPELL_SCREECH = 6605, + SPELL_SHADOW_WORD_PAIN = 23952, + SPELL_MIND_FLAY = 23953, + SPELL_CHAIN_MIND_FLAY = 26044, // Right ID unknown. So disabled + SPELL_GREATERHEAL = 23954, + SPELL_BAT_FORM = 23966, // Batriders Spell - SPELL_BOMB = 40332 // Wrong ID but Magmadars bomb is not working... + SPELL_BOMB = 40332 // Wrong ID but Magmadars bomb is not working... }; enum BatIds { - NPC_BLOODSEEKER_BAT = 11368, - NPC_FRENZIED_BAT = 14965 + NPC_BLOODSEEKER_BAT = 11368, + NPC_FRENZIED_BAT = 14965 }; enum Events { - EVENT_CHARGE_JEKLIK = 1, + EVENT_CHARGE_JEKLIK = 1, EVENT_SONIC_BURST, EVENT_SCREECH, EVENT_SPAWN_BATS, @@ -63,8 +63,8 @@ enum Events enum Phase { - PHASE_ONE = 1, - PHASE_TWO = 2 + PHASE_ONE = 1, + PHASE_TWO = 2 }; Position const SpawnBat[6] = @@ -124,7 +124,6 @@ class boss_jeklik : public CreatureScript events.ScheduleEvent(EVENT_CHAIN_MIND_FLAY, 26s, 0, PHASE_TWO); events.ScheduleEvent(EVENT_GREATER_HEAL, 50s, 0, PHASE_TWO); events.ScheduleEvent(EVENT_SPAWN_FLYING_BATS, 10s, 0, PHASE_TWO); - return; } } @@ -143,7 +142,7 @@ class boss_jeklik : public CreatureScript switch (eventId) { case EVENT_CHARGE_JEKLIK: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.f, true)) { DoCast(target, SPELL_CHARGE); AttackStart(target); @@ -159,14 +158,14 @@ class boss_jeklik : public CreatureScript events.ScheduleEvent(EVENT_SCREECH, urand(18000, 26000), 0, PHASE_ONE); break; case EVENT_SPAWN_BATS: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.f, true)) for (uint8 i = 0; i < 6; ++i) - if (Creature* bat = me->SummonCreature(NPC_BLOODSEEKER_BAT, SpawnBat[i], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000)) + if (TempSummon* bat = me->SummonCreature(NPC_BLOODSEEKER_BAT, SpawnBat[i], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000)) bat->AI()->AttackStart(target); events.ScheduleEvent(EVENT_SPAWN_BATS, 1min, 0, PHASE_ONE); break; case EVENT_SHADOW_WORD_PAIN: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.f, true)) DoCast(target, SPELL_SHADOW_WORD_PAIN); events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, urand(12000, 18000), 0, PHASE_TWO); break; @@ -185,8 +184,8 @@ class boss_jeklik : public CreatureScript events.ScheduleEvent(EVENT_GREATER_HEAL, urand(25000, 35000), 0, PHASE_TWO); break; case EVENT_SPAWN_FLYING_BATS: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - if (Creature* flyingBat = me->SummonCreature(NPC_FRENZIED_BAT, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ() + 15.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.f, true)) + if (TempSummon* flyingBat = me->SummonCreature(NPC_FRENZIED_BAT, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ() + 15.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000)) flyingBat->AI()->AttackStart(target); events.ScheduleEvent(EVENT_SPAWN_FLYING_BATS, urand(10000, 15000), 0, PHASE_TWO); break; @@ -223,11 +222,9 @@ class npc_batrider : public CreatureScript void Initialize() { - Bomb_Timer = 2000; + _bombTimer = 2000; } - uint32 Bomb_Timer; - void Reset() override { Initialize(); @@ -241,19 +238,22 @@ class npc_batrider : public CreatureScript if (!UpdateVictim()) return; - if (Bomb_Timer <= diff) + if (_bombTimer <= diff) { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.f, true)) { DoCast(target, SPELL_BOMB); - Bomb_Timer = 5000; + _bombTimer = 5000; } } else - Bomb_Timer -= diff; + _bombTimer -= diff; DoMeleeAttackIfReady(); } + + private: + uint32 _bombTimer; }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp index 74d2e1841ff..678e96d4cb1 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp @@ -16,12 +16,12 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include "ScriptMgr.h" +#include "zulgurub.h" #include "InstanceScript.h" #include "ObjectAccessor.h" #include "ScriptedCreature.h" +#include "ScriptMgr.h" #include "TemporarySummon.h" -#include "zulgurub.h" enum Say { @@ -148,8 +148,8 @@ class boss_jindo : public CreatureScript // Summon a formation of trolls for (uint8 i = 0; i < 10; ++i) - if (Creature* SacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, Formation[i].GetPositionX(), Formation[i].GetPositionY(), Formation[i].GetPositionZ(), Formation[i].GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000)) - SacrificedTroll->AI()->AttackStart(target); + if (TempSummon* sacrificedTroll = me->SummonCreature(NPC_SACRIFICED_TROLL, Formation[i], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000)) + sacrificedTroll->AI()->AttackStart(target); } events.ScheduleEvent(EVENT_TELEPORT, 15s, 23s); break; @@ -179,39 +179,40 @@ class npc_healing_ward : public CreatureScript struct npc_healing_wardAI : public ScriptedAI { - npc_healing_wardAI(Creature* creature) : ScriptedAI(creature) + npc_healing_wardAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { Initialize(); - instance = creature->GetInstanceScript(); + creature->SetReactState(REACT_PASSIVE); } void Initialize() { - Heal_Timer = 2000; + _healTimer = 2000; } - uint32 Heal_Timer; - InstanceScript* instance; - void Reset() override { Initialize(); } - void JustEngagedWith(Unit* /*who*/) override { } + void AttackStart(Unit* /*victim*/) override { } void UpdateAI(uint32 diff) override { // Heal_Timer - if (Heal_Timer <= diff) + if (_healTimer <= diff) { - if (Unit* jindo = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_JINDO))) + if (Creature* jindo = _instance->GetCreature(DATA_JINDO)) DoCast(jindo, SPELL_HEAL); - Heal_Timer = 3000; - } else Heal_Timer -= diff; - - DoMeleeAttackIfReady(); + _healTimer = 3000; + } + else + _healTimer -= diff; } + + private: + uint32 _healTimer; + InstanceScript* _instance; }; CreatureAI* GetAI(Creature* creature) const override @@ -220,7 +221,7 @@ class npc_healing_ward : public CreatureScript } }; -//Shade of Jindo +// Shade of Jindo class npc_shade_of_jindo : public CreatureScript { public: @@ -235,30 +236,34 @@ class npc_shade_of_jindo : public CreatureScript void Initialize() { - ShadowShock_Timer = 1000; + _shadowShockTimer = 1000; } - uint32 ShadowShock_Timer; - void Reset() override { Initialize(); DoCast(me, SPELL_INVISIBLE, true); } - void JustEngagedWith(Unit* /*who*/) override { } - void UpdateAI(uint32 diff) override { + if (!UpdateVictim()) + return; + // ShadowShock_Timer - if (ShadowShock_Timer <= diff) + if (_shadowShockTimer <= diff) { DoCastVictim(SPELL_SHADOWSHOCK); - ShadowShock_Timer = 2000; - } else ShadowShock_Timer -= diff; + _shadowShockTimer = 2000; + } + else + _shadowShockTimer -= diff; DoMeleeAttackIfReady(); } + + private: + uint32 _shadowShockTimer; }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp index 29a497cf782..da337bc1a3b 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp @@ -16,22 +16,15 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* ScriptData -SDName: Boss_Mandokir -SD%Complete: 90 -SDComment: Ohgan function needs improvements. -SDCategory: Zul'Gurub -EndScriptData */ - -#include "ScriptMgr.h" +#include "zulgurub.h" #include "InstanceScript.h" #include "MotionMaster.h" #include "ObjectAccessor.h" #include "ScriptedCreature.h" +#include "ScriptMgr.h" #include "SpellAuras.h" #include "SpellScript.h" #include "TemporarySummon.h" -#include "zulgurub.h" enum Says { @@ -59,7 +52,7 @@ enum Spells enum Events { - EVENT_CHECK_SPEAKER = 1, + EVENT_CHECK_SPEAKER = 1, EVENT_CHECK_START, EVENT_STARTED, EVENT_OVERPOWER, @@ -121,7 +114,7 @@ class boss_mandokir : public CreatureScript void Initialize() { - killCount = 0; + _killCount = 0; } void Reset() override @@ -132,7 +125,7 @@ class boss_mandokir : public CreatureScript Initialize(); me->SetImmuneToAll(true); events.ScheduleEvent(EVENT_CHECK_START, 1s); - if (Creature* speaker = ObjectAccessor::GetCreature(*me, instance->GetGuidData(NPC_VILEBRANCH_SPEAKER))) + if (Creature* speaker = instance->GetCreature(DATA_VILEBRANCH_SPEAKER)) if (!speaker->IsAlive()) speaker->Respawn(true); } @@ -142,10 +135,7 @@ class boss_mandokir : public CreatureScript void JustDied(Unit* /*killer*/) override { - // Do not want to unsummon Ohgan - for (int i = 0; i < CHAINED_SPIRT_COUNT; ++i) - if (Creature* unsummon = ObjectAccessor::GetCreature(*me, chainedSpirtGUIDs[i])) - unsummon->DespawnOrUnsummon(); + summons.DespawnEntry(NPC_CHAINED_SPIRT); instance->SetBossState(DATA_MANDOKIR, DONE); instance->SaveToDB(); } @@ -166,14 +156,13 @@ class boss_mandokir : public CreatureScript 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->GetPositionX()-3, me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), 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) - { - Creature* chainedSpirt = me->SummonCreature(NPC_CHAINED_SPIRT, PosSummonChainedSpirits[i], TEMPSUMMON_CORPSE_DESPAWN); - chainedSpirtGUIDs[i] = chainedSpirt->GetGUID(); - } + me->SummonCreature(NPC_CHAINED_SPIRT, PosSummonChainedSpirits[i], TEMPSUMMON_CORPSE_DESPAWN); + DoZoneInCombat(); } @@ -182,14 +171,14 @@ class boss_mandokir : public CreatureScript if (victim->GetTypeId() != TYPEID_PLAYER) return; - if (++killCount == 3) + if (++_killCount == 3) { Talk(SAY_DING_KILL); - if (Creature* jindo = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_JINDO))) + if (Creature* jindo = instance->GetCreature(DATA_JINDO)) if (jindo->IsAlive()) jindo->AI()->Talk(SAY_GRATS_JINDO); DoCast(me, SPELL_LEVEL_UP, true); - killCount = 0; + _killCount = 0; } } @@ -231,7 +220,7 @@ class boss_mandokir : public CreatureScript case EVENT_CHECK_START: if (instance->GetBossState(DATA_MANDOKIR) == SPECIAL) { - me->GetMotionMaster()->MovePoint(0, PosMandokir[1].m_positionX, PosMandokir[1].m_positionY, PosMandokir[1].m_positionZ); + me->GetMotionMaster()->MovePoint(0, PosMandokir[1]); events.ScheduleEvent(EVENT_STARTED, 6s); } else @@ -293,8 +282,7 @@ class boss_mandokir : public CreatureScript } private: - uint8 killCount; - ObjectGuid chainedSpirtGUIDs[CHAINED_SPIRT_COUNT]; + uint8 _killCount; }; CreatureAI* GetAI(Creature* creature) const override @@ -317,14 +305,14 @@ class npc_ohgan : public CreatureScript struct npc_ohganAI : public ScriptedAI { - npc_ohganAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) + npc_ohganAI(Creature* creature) : ScriptedAI(creature) { Initialize(); } void Initialize() { - SunderArmor_Timer = 5000; + _sunderArmorTimer = 5000; } void Reset() override @@ -332,26 +320,24 @@ class npc_ohgan : public CreatureScript Initialize(); } - void JustEngagedWith(Unit* /*who*/) override { } - void UpdateAI(uint32 diff) override { - // Return since we have no target if (!UpdateVictim()) return; - if (SunderArmor_Timer <= diff) + if (_sunderArmorTimer <= diff) { DoCastVictim(SPELL_SUNDERARMOR, true); - SunderArmor_Timer = urand(10000, 15000); - } else SunderArmor_Timer -= diff; + _sunderArmorTimer = urand(10000, 15000); + } + else + _sunderArmorTimer -= diff; DoMeleeAttackIfReady(); } private: - uint32 SunderArmor_Timer; - InstanceScript* instance; + uint32 _sunderArmorTimer; }; CreatureAI* GetAI(Creature* creature) const override @@ -373,15 +359,15 @@ class npc_vilebranch_speaker : public CreatureScript struct npc_vilebranch_speakerAI : public ScriptedAI { - npc_vilebranch_speakerAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) + npc_vilebranch_speakerAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { Initialize(); } void Initialize() { - demoralizing_Shout_Timer = urand(2000, 4000); - cleave_Timer = urand(5000, 8000); + _demoralizingShoutTimer = urand(2000, 4000); + _cleaveTimer = urand(5000, 8000); } void Reset() override @@ -389,11 +375,9 @@ class npc_vilebranch_speaker : public CreatureScript Initialize(); } - void JustEngagedWith(Unit* /*who*/) override { } - void JustDied(Unit* /*killer*/) override { - instance->SetBossState(DATA_MANDOKIR, SPECIAL); + _instance->SetBossState(DATA_MANDOKIR, SPECIAL); } void UpdateAI(uint32 diff) override @@ -402,25 +386,29 @@ class npc_vilebranch_speaker : public CreatureScript if (!UpdateVictim()) return; - if (demoralizing_Shout_Timer <= diff) + if (_demoralizingShoutTimer <= diff) { DoCast(me, SPELL_DEMORALIZING_SHOUT); - demoralizing_Shout_Timer = urand(22000, 30000); - } else demoralizing_Shout_Timer -= diff; + _demoralizingShoutTimer = urand(22000, 30000); + } + else + _demoralizingShoutTimer -= diff; - if (cleave_Timer <= diff) + if (_cleaveTimer <= diff) { DoCastVictim(SPELL_CLEAVE, true); - cleave_Timer = urand(6000, 9000); - } else cleave_Timer -= diff; + _cleaveTimer = urand(6000, 9000); + } + else + _cleaveTimer -= diff; DoMeleeAttackIfReady(); } private: - uint32 demoralizing_Shout_Timer; - uint32 cleave_Timer; - InstanceScript* instance; + uint32 _demoralizingShoutTimer; + uint32 _cleaveTimer; + InstanceScript* _instance; }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp index b611e76e316..44e35890c70 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp @@ -16,23 +16,16 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* ScriptData -SDName: Boss_Marli -SD%Complete: 80 -SDComment: Charging healers and casters not working. Perhaps wrong Spell Timers. -SDCategory: Zul'Gurub -EndScriptData */ - -#include "SpellScript.h" -#include "SpellInfo.h" -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "TemporarySummon.h" #include "zulgurub.h" -#include "InstanceScript.h" -#include "GameObjectAI.h" #include "GameObject.h" +#include "GameObjectAI.h" +#include "InstanceScript.h" #include "Object.h" +#include "ScriptedCreature.h" +#include "ScriptMgr.h" +#include "SpellInfo.h" +#include "SpellScript.h" +#include "TemporarySummon.h" enum Says { @@ -101,8 +94,7 @@ class boss_marli : public CreatureScript std::list<GameObject*> eggs; me->GetGameObjectListWithEntryInGrid(eggs, GOB_SPIDER_EGG); - - for(GameObject* egg : eggs) + for (GameObject* egg : eggs) { egg->Respawn(); egg->UpdateObjectVisibility(true); @@ -127,7 +119,7 @@ class boss_marli : public CreatureScript void JustSummoned(Creature* creature) override { - creature->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM)); + creature->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0, 0.f, true)); summons.Summon(creature); } @@ -146,10 +138,8 @@ class boss_marli : public CreatureScript switch (eventId) { case EVENT_SPAWN_START_SPIDERS: - { Talk(SAY_SPIDER_SPAWN); DoCastAOE(SPELL_HATCH_EGGS); - events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 12s, 0, PHASE_TWO); events.ScheduleEvent(EVENT_TRANSFORM, 45s, 0, PHASE_TWO); events.ScheduleEvent(EVENT_POISON_VOLLEY, 15s); @@ -157,14 +147,13 @@ class boss_marli : public CreatureScript events.ScheduleEvent(EVENT_TRANSFORM, 45s, 0, PHASE_TWO); events.SetPhase(PHASE_TWO); break; - } case EVENT_POISON_VOLLEY: DoCastVictim(SPELL_POISON_VOLLEY, true); events.ScheduleEvent(EVENT_POISON_VOLLEY, 10s, 20s); break; case EVENT_ASPECT_OF_MARLI: DoCastVictim(SPELL_ASPECT_OF_MARLI, true); - events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, urand(13000, 18000), 0, PHASE_TWO); + events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 13s, 18s, 0, PHASE_TWO); break; case EVENT_HATCH_SPIDER_EGG: me->CastSpell(me, SPELL_HATCH_SPIDER_EGG); @@ -283,33 +272,32 @@ class npc_spawn_of_marli : public CreatureScript void Initialize() { - LevelUp_Timer = 3000; + _levelUpTimer = 3000; } - uint32 LevelUp_Timer; - void Reset() override { Initialize(); } - void JustEngagedWith(Unit* /*who*/) override { } - void UpdateAI(uint32 diff) override { - //Return since we have no target if (!UpdateVictim()) return; - //LevelUp_Timer - if (LevelUp_Timer <= diff) + if (_levelUpTimer <= diff) { DoCast(me, SPELL_LEVELUP); - LevelUp_Timer = 3000; - } else LevelUp_Timer -= diff; + _levelUpTimer = 3000; + } + else + _levelUpTimer -= diff; DoMeleeAttackIfReady(); } + + private: + uint32 _levelUpTimer; }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp index 379901ad7cc..ddfbdf42107 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp @@ -16,26 +16,19 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* ScriptData -SDName: Boss_Renataki -SD%Complete: 100 -SDComment: -SDCategory: Zul'Gurub -EndScriptData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" #include "zulgurub.h" +#include "ScriptedCreature.h" +#include "ScriptMgr.h" enum Spells { - SPELL_AMBUSH = 34794, - SPELL_THOUSANDBLADES = 34799 + SPELL_AMBUSH = 34794, + SPELL_THOUSANDBLADES = 34799 }; enum Misc { - EQUIP_ID_MAIN_HAND = 0 //was item display id 31818, but this id does not exist + EQUIP_ID_MAIN_HAND = 0 // was item display id 31818, but this id does not exist }; class boss_renataki : public CreatureScript @@ -52,25 +45,15 @@ class boss_renataki : public CreatureScript void Initialize() { - Invisible_Timer = urand(8000, 18000); - Ambush_Timer = 3000; - Visible_Timer = 4000; - Aggro_Timer = urand(15000, 25000); - ThousandBlades_Timer = urand(4000, 8000); - - Invisible = false; - Ambushed = false; + _invisibleTimer = urand(8000, 18000); + _ambushTimer = 3000; + _visibleTimer = 4000; + _aggroTimer = urand(15000, 25000); + _thousandBladesTimer = urand(4000, 8000); + _invisible = false; + _ambushed = false; } - uint32 Invisible_Timer; - uint32 Ambush_Timer; - uint32 Visible_Timer; - uint32 Aggro_Timer; - uint32 ThousandBlades_Timer; - - bool Invisible; - bool Ambushed; - void Reset() override { _Reset(); @@ -92,23 +75,21 @@ class boss_renataki : public CreatureScript if (!UpdateVictim()) return; - //Invisible_Timer - if (Invisible_Timer <= diff) + if (_invisibleTimer <= diff) { me->InterruptSpell(CURRENT_GENERIC_SPELL); - SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); me->SetDisplayId(11686); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - Invisible = true; - - Invisible_Timer = urand(15000, 30000); - } else Invisible_Timer -= diff; + _invisible = true; + _invisibleTimer = urand(15000, 30000); + } + else + _invisibleTimer -= diff; - if (Invisible) + if (_invisible) { - if (Ambush_Timer <= diff) + if (_ambushTimer <= diff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) { @@ -116,31 +97,32 @@ class boss_renataki : public CreatureScript DoCast(target, SPELL_AMBUSH); } - Ambushed = true; - Ambush_Timer = 3000; - } else Ambush_Timer -= diff; + _ambushed = true; + _ambushTimer = 3000; + } + else + _ambushTimer -= diff; } - if (Ambushed) + if (_ambushed) { - if (Visible_Timer <= diff) + if (_visibleTimer <= diff) { me->InterruptSpell(CURRENT_GENERIC_SPELL); - me->SetDisplayId(15268); SetEquipmentSlots(false, EQUIP_ID_MAIN_HAND, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - Invisible = false; - - Visible_Timer = 4000; - } else Visible_Timer -= diff; + _invisible = false; + _visibleTimer = 4000; + } + else + _visibleTimer -= diff; } - //Resetting some aggro so he attacks other gamers - if (!Invisible) + // Resetting some aggro so he attacks other gamers + if (!_invisible) { - if (Aggro_Timer <= diff) + if (_aggroTimer <= diff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) { @@ -149,18 +131,31 @@ class boss_renataki : public CreatureScript AttackStart(target); } - Aggro_Timer = urand(7000, 20000); - } else Aggro_Timer -= diff; + _aggroTimer = urand(7000, 20000); + } + else + _aggroTimer -= diff; - if (ThousandBlades_Timer <= diff) + if (_thousandBladesTimer <= diff) { DoCastVictim(SPELL_THOUSANDBLADES); - ThousandBlades_Timer = urand(7000, 12000); - } else ThousandBlades_Timer -= diff; + _thousandBladesTimer = urand(7000, 12000); + } + else + _thousandBladesTimer -= diff; } DoMeleeAttackIfReady(); } + + private: + uint32 _invisibleTimer; + uint32 _ambushTimer; + uint32 _visibleTimer; + uint32 _aggroTimer; + uint32 _thousandBladesTimer; + bool _invisible; + bool _ambushed; }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp index 829e4cf9218..dec999545f1 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp @@ -16,18 +16,11 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* ScriptData -SDName: Boss_Thekal -SD%Complete: 95 -SDComment: Almost finished. -SDCategory: Zul'Gurub -EndScriptData */ - -#include "ScriptMgr.h" +#include "zulgurub.h" #include "InstanceScript.h" #include "ObjectAccessor.h" #include "ScriptedCreature.h" -#include "zulgurub.h" +#include "ScriptMgr.h" enum Says { @@ -99,13 +92,10 @@ class boss_thekal : public CreatureScript void Initialize() { - Enraged = false; - WasDead = false; + _enraged = false; + _wasDead = false; } - bool Enraged; - bool WasDead; - void Reset() override { if (events.IsInPhase(PHASE_TWO)) @@ -151,15 +141,15 @@ class boss_thekal : public CreatureScript { case EVENT_MORTALCLEAVE: DoCastVictim(SPELL_MORTALCLEAVE, true); - events.ScheduleEvent(EVENT_MORTALCLEAVE, urand(15000, 20000), 0, PHASE_ONE); + events.ScheduleEvent(EVENT_MORTALCLEAVE, 15s, 20s, 0, PHASE_ONE); break; case EVENT_SILENCE: DoCastVictim(SPELL_SILENCE, true); - events.ScheduleEvent(EVENT_SILENCE, urand(20000, 25000), 0, PHASE_ONE); + events.ScheduleEvent(EVENT_SILENCE, 20s, 25s, 0, PHASE_ONE); break; case EVENT_RESURRECT_TIMER: - //Thekal will transform to Tiger if he died and was not resurrected after 10 seconds. - if (WasDead) + // Thekal will transform to Tiger if he died and was not resurrected after 10 seconds. + if (_wasDead) { DoCast(me, SPELL_TIGER_FORM); // SPELL_AURA_TRANSFORM me->SetObjectScale(2.00f); @@ -183,31 +173,31 @@ class boss_thekal : public CreatureScript events.ScheduleEvent(EVENT_RESURRECT_TIMER, 10s, 0, PHASE_ONE); break; case EVENT_CHECK_TIMER: - //Check_Timer for the death of LorKhan and Zath. - if (!WasDead) + // Check_Timer for the death of LorKhan and Zath. + if (!_wasDead) { if (instance->GetBossState(DATA_LORKHAN) == SPECIAL) { - //Resurrect LorKhan - if (Unit* pLorKhan = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_LORKHAN))) + // Resurrect LorKhan + if (Creature* lorKhan = instance->GetCreature(DATA_LORKHAN)) { - pLorKhan->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - pLorKhan->SetFaction(FACTION_MONSTER); - pLorKhan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - pLorKhan->SetFullHealth(); + lorKhan->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + lorKhan->SetFaction(FACTION_MONSTER); + lorKhan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + lorKhan->SetFullHealth(); instance->SetData(DATA_LORKHAN, DONE); } } if (instance->GetBossState(DATA_ZATH) == SPECIAL) { - //Resurrect Zath - if (Unit* pZath = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_ZATH))) + // Resurrect Zath + if (Creature* zath = instance->GetCreature(DATA_ZATH)) { - pZath->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - pZath->SetFaction(FACTION_MONSTER); - pZath->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - pZath->SetFullHealth(); + zath->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + zath->SetFaction(FACTION_MONSTER); + zath->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + zath->SetFullHealth(); instance->SetBossState(DATA_ZATH, DONE); } } @@ -220,37 +210,37 @@ class boss_thekal : public CreatureScript break; case EVENT_FORCEPUNCH: DoCastVictim(SPELL_FORCEPUNCH, true); - events.ScheduleEvent(EVENT_FORCEPUNCH, urand(16000, 21000), 0, PHASE_TWO); + events.ScheduleEvent(EVENT_FORCEPUNCH, 16s, 21s, 0, PHASE_TWO); break; case EVENT_CHARGE: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.f, true)) { - DoCast(target, SPELL_CHARGE); ResetThreatList(); AttackStart(target); + DoCast(target, SPELL_CHARGE); } - events.ScheduleEvent(EVENT_CHARGE, urand(15000, 22000), 0, PHASE_TWO); + events.ScheduleEvent(EVENT_CHARGE, 15s, 22s, 0, PHASE_TWO); break; case EVENT_ENRAGE: - if (HealthBelowPct(11) && !Enraged) + if (HealthBelowPct(11) && !_enraged) { DoCast(me, SPELL_ENRAGE); - Enraged = true; + _enraged = true; } events.ScheduleEvent(EVENT_ENRAGE, 30s); break; case EVENT_SUMMONTIGERS: DoCastVictim(SPELL_SUMMONTIGERS, true); - events.ScheduleEvent(EVENT_SUMMONTIGERS, urand(10000, 14000), 0, PHASE_TWO); + events.ScheduleEvent(EVENT_SUMMONTIGERS, 10s, 14s, 0, PHASE_TWO); break; default: break; } - if (me->IsFullHealth() && WasDead) - WasDead = false; + if (me->IsFullHealth() && _wasDead) + _wasDead = false; - if ((events.IsInPhase(PHASE_ONE)) && !WasDead && !HealthAbovePct(5)) + if ((events.IsInPhase(PHASE_ONE)) && !_wasDead && !HealthAbovePct(5)) { me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT); me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE); @@ -259,14 +249,19 @@ class boss_thekal : public CreatureScript me->SetStandState(UNIT_STAND_STATE_SLEEP); me->AttackStop(); instance->SetBossState(DATA_THEKAL, SPECIAL); - WasDead = true; + _wasDead = true; } if (me->HasUnitState(UNIT_STATE_CASTING)) return; } + DoMeleeAttackIfReady(); } + + private: + bool _enraged; + bool _wasDead; }; CreatureAI* GetAI(Creature* creature) const override @@ -275,133 +270,121 @@ class boss_thekal : public CreatureScript } }; -//Zealot Lor'Khan +// Zealot Lor'Khan class npc_zealot_lorkhan : public CreatureScript { public: npc_zealot_lorkhan() : CreatureScript("npc_zealot_lorkhan") { } struct npc_zealot_lorkhanAI : public ScriptedAI { - npc_zealot_lorkhanAI(Creature* creature) : ScriptedAI(creature) + npc_zealot_lorkhanAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { Initialize(); - instance = creature->GetInstanceScript(); } void Initialize() { - Shield_Timer = 1000; - BloodLust_Timer = 16000; - GreaterHeal_Timer = 32000; - Disarm_Timer = 6000; - Check_Timer = 10000; - - FakeDeath = false; + _shieldTimer = 1000; + _bloodLustTimer = 16000; + _greaterHealTimer = 32000; + _disarmTimer = 6000; + _checkTimer = 10000; + _fakeDeath = false; } - uint32 Shield_Timer; - uint32 BloodLust_Timer; - uint32 GreaterHeal_Timer; - uint32 Disarm_Timer; - uint32 Check_Timer; - - bool FakeDeath; - - InstanceScript* instance; - void Reset() override { Initialize(); - instance->SetBossState(DATA_LORKHAN, NOT_STARTED); - + _instance->SetBossState(DATA_LORKHAN, NOT_STARTED); me->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } - void JustEngagedWith(Unit* /*who*/) override - { - } - void UpdateAI(uint32 diff) override { if (!UpdateVictim()) return; - //Shield_Timer - if (Shield_Timer <= diff) + if (_shieldTimer <= diff) { DoCast(me, SPELL_SHIELD); - Shield_Timer = 61000; - } else Shield_Timer -= diff; + _shieldTimer = 61000; + } + else + _shieldTimer -= diff; - //BloodLust_Timer - if (BloodLust_Timer <= diff) + if (_bloodLustTimer <= diff) { DoCast(me, SPELL_BLOODLUST); - BloodLust_Timer = 20000 + rand32() % 8000; - } else BloodLust_Timer -= diff; + _bloodLustTimer = 20000 + rand32() % 8000; + } + else + _bloodLustTimer -= diff; - //Casting Greaterheal to Thekal or Zath if they are in meele range. - if (GreaterHeal_Timer <= diff) + // Casting Greaterheal to Thekal or Zath if they are in meele range. + if (_greaterHealTimer <= diff) { - Unit* pThekal = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_THEKAL)); - Unit* pZath = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_ZATH)); + Creature* thekal = _instance->GetCreature(DATA_THEKAL); + Creature* zath = _instance->GetCreature(DATA_ZATH); + if (!thekal && !zath) + return; - if (!pThekal || !pZath) + bool roll = roll_chance_i(50); + Creature* target = roll ? (thekal ? thekal : zath) : (zath ? zath : thekal); + if (!target) return; - switch (urand(0, 1)) - { - case 0: - if (me->IsWithinMeleeRange(pThekal)) - DoCast(pThekal, SPELL_GREATERHEAL); - break; - case 1: - if (me->IsWithinMeleeRange(pZath)) - DoCast(pZath, SPELL_GREATERHEAL); - break; - } + if (!me->IsWithinMeleeRange(target)) + target = roll ? zath : thekal; - GreaterHeal_Timer = 15000 + rand32() % 5000; - } else GreaterHeal_Timer -= diff; + if (me->IsWithinMeleeRange(target)) + DoCast(target, SPELL_GREATERHEAL); - //Disarm_Timer - if (Disarm_Timer <= diff) + _greaterHealTimer = 15000 + rand32() % 5000; + } + else + _greaterHealTimer -= diff; + + if (_disarmTimer <= diff) { DoCastVictim(SPELL_DISARM); - Disarm_Timer = 15000 + rand32() % 10000; - } else Disarm_Timer -= diff; + _disarmTimer = 15000 + rand32() % 10000; + } + else + _disarmTimer -= diff; - //Check_Timer for the death of LorKhan and Zath. - if (!FakeDeath && Check_Timer <= diff) + // Check for the death of LorKhan and Zath. + if (!_fakeDeath && _checkTimer <= diff) { - if (instance->GetBossState(DATA_THEKAL) == SPECIAL) + if (_instance->GetBossState(DATA_THEKAL) == SPECIAL) { - //Resurrect Thekal - if (Unit* pThekal = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_THEKAL))) + // Resurrect Thekal + if (Creature* thekal = _instance->GetCreature(DATA_THEKAL)) { - pThekal->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - pThekal->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - pThekal->SetFaction(FACTION_MONSTER); - pThekal->SetFullHealth(); + thekal->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + thekal->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + thekal->SetFaction(FACTION_MONSTER); + thekal->SetFullHealth(); } } - if (instance->GetBossState(DATA_ZATH) == SPECIAL) + if (_instance->GetBossState(DATA_ZATH) == SPECIAL) { - //Resurrect Zath - if (Unit* pZath = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_ZATH))) + // Resurrect Zath + if (Creature* zath = _instance->GetCreature(DATA_ZATH)) { - pZath->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - pZath->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - pZath->SetFaction(FACTION_MONSTER); - pZath->SetFullHealth(); + zath->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + zath->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + zath->SetFaction(FACTION_MONSTER); + zath->SetFullHealth(); } } - Check_Timer = 5000; - } else Check_Timer -= diff; + _checkTimer = 5000; + } + else + _checkTimer -= diff; if (!HealthAbovePct(5)) { @@ -413,13 +396,22 @@ class npc_zealot_lorkhan : public CreatureScript me->SetFaction(FACTION_FRIENDLY); me->AttackStop(); - instance->SetBossState(DATA_LORKHAN, SPECIAL); + _instance->SetBossState(DATA_LORKHAN, SPECIAL); - FakeDeath = true; + _fakeDeath = true; } DoMeleeAttackIfReady(); } + + private: + uint32 _shieldTimer; + uint32 _bloodLustTimer; + uint32 _greaterHealTimer; + uint32 _disarmTimer; + uint32 _checkTimer; + bool _fakeDeath; + InstanceScript* _instance; }; CreatureAI* GetAI(Creature* creature) const override @@ -428,7 +420,7 @@ class npc_zealot_lorkhan : public CreatureScript } }; -//Zealot Zath +// Zealot Zath class npc_zealot_zath : public CreatureScript { public: @@ -436,122 +428,112 @@ class npc_zealot_zath : public CreatureScript struct npc_zealot_zathAI : public ScriptedAI { - npc_zealot_zathAI(Creature* creature) : ScriptedAI(creature) + npc_zealot_zathAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { Initialize(); - instance = creature->GetInstanceScript(); } void Initialize() { - SweepingStrikes_Timer = 13000; - SinisterStrike_Timer = 8000; - Gouge_Timer = 25000; - Kick_Timer = 18000; - Blind_Timer = 5000; - Check_Timer = 10000; - - FakeDeath = false; + _sweepingStrikesTimer = 13000; + _sinisterStrikeTimer = 8000; + _gougeTimer = 25000; + _kickTimer = 18000; + _blindTimer = 5000; + _checkTimer = 10000; + _fakeDeath = false; } - uint32 SweepingStrikes_Timer; - uint32 SinisterStrike_Timer; - uint32 Gouge_Timer; - uint32 Kick_Timer; - uint32 Blind_Timer; - uint32 Check_Timer; - - bool FakeDeath; - - InstanceScript* instance; - void Reset() override { Initialize(); - instance->SetBossState(DATA_ZATH, NOT_STARTED); + _instance->SetBossState(DATA_ZATH, NOT_STARTED); me->SetStandState(UNIT_STAND_STATE_STAND); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } - void JustEngagedWith(Unit* /*who*/) override - { - } - void UpdateAI(uint32 diff) override { if (!UpdateVictim()) return; - //SweepingStrikes_Timer - if (SweepingStrikes_Timer <= diff) + if (_sweepingStrikesTimer <= diff) { DoCastVictim(SPELL_SWEEPINGSTRIKES); - SweepingStrikes_Timer = 22000 + rand32() % 4000; - } else SweepingStrikes_Timer -= diff; + _sweepingStrikesTimer = 22000 + rand32() % 4000; + } + else + _sweepingStrikesTimer -= diff; - //SinisterStrike_Timer - if (SinisterStrike_Timer <= diff) + if (_sinisterStrikeTimer <= diff) { DoCastVictim(SPELL_SINISTERSTRIKE); - SinisterStrike_Timer = 8000 + rand32() % 8000; - } else SinisterStrike_Timer -= diff; + _sinisterStrikeTimer = 8000 + rand32() % 8000; + } + else + _sinisterStrikeTimer -= diff; - //Gouge_Timer - if (Gouge_Timer <= diff) + if (_gougeTimer <= diff) { DoCastVictim(SPELL_GOUGE); if (GetThreat(me->GetVictim())) ModifyThreatByPercent(me->GetVictim(), -100); - Gouge_Timer = 17000 + rand32() % 10000; - } else Gouge_Timer -= diff; + _gougeTimer = 17000 + rand32() % 10000; + } + else + _gougeTimer -= diff; - //Kick_Timer - if (Kick_Timer <= diff) + if (_kickTimer <= diff) { DoCastVictim(SPELL_KICK); - Kick_Timer = 15000 + rand32() % 10000; - } else Kick_Timer -= diff; + _kickTimer = 15000 + rand32() % 10000; + } + else + _kickTimer -= diff; - //Blind_Timer - if (Blind_Timer <= diff) + if (_blindTimer <= diff) { DoCastVictim(SPELL_BLIND); - Blind_Timer = 10000 + rand32() % 10000; - } else Blind_Timer -= diff; + _blindTimer = 10000 + rand32() % 10000; + } + else + _blindTimer -= diff; - //Check_Timer for the death of LorKhan and Zath. - if (!FakeDeath && Check_Timer <= diff) + // Check for the death of LorKhan and Thekal. + if (!_fakeDeath && _checkTimer <= diff) { - if (instance->GetBossState(DATA_LORKHAN) == SPECIAL) + if (_instance->GetBossState(DATA_LORKHAN) == SPECIAL) { - //Resurrect LorKhan - if (Unit* pLorKhan = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_LORKHAN))) + // Resurrect LorKhan + if (Creature* lorkhan = _instance->GetCreature(DATA_LORKHAN)) { - pLorKhan->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - pLorKhan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - pLorKhan->SetFaction(14); - pLorKhan->SetFullHealth(); + lorkhan->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + lorkhan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + lorkhan->SetFaction(14); + lorkhan->SetFullHealth(); } } - if (instance->GetBossState(DATA_THEKAL) == SPECIAL) + if (_instance->GetBossState(DATA_THEKAL) == SPECIAL) { - //Resurrect Thekal - if (Unit* pThekal = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_THEKAL))) + // Resurrect Thekal + if (Creature* thekal = _instance->GetCreature(DATA_THEKAL)) { - pThekal->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); - pThekal->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - pThekal->SetFaction(14); - pThekal->SetFullHealth(); + thekal->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + thekal->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + thekal->SetFaction(FACTION_MONSTER); + thekal->SetFullHealth(); } } - Check_Timer = 5000; - } else Check_Timer -= diff; + _checkTimer = 5000; + } + else + _checkTimer -= diff; if (!HealthAbovePct(5)) { @@ -563,13 +545,23 @@ class npc_zealot_zath : public CreatureScript me->SetFaction(35); me->AttackStop(); - instance->SetBossState(DATA_ZATH, SPECIAL); + _instance->SetBossState(DATA_ZATH, SPECIAL); - FakeDeath = true; + _fakeDeath = true; } DoMeleeAttackIfReady(); } + + private: + uint32 _sweepingStrikesTimer; + uint32 _sinisterStrikeTimer; + uint32 _gougeTimer; + uint32 _kickTimer; + uint32 _blindTimer; + uint32 _checkTimer; + bool _fakeDeath; + InstanceScript* _instance; }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp index b0c17f59a72..05d49e1cc43 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp @@ -16,11 +16,11 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include "zulgurub.h" #include "ObjectMgr.h" -#include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "ScriptMgr.h" #include "Spell.h" -#include "zulgurub.h" /* * @todo @@ -42,13 +42,14 @@ enum Spells SPELL_HOLY_NOVA = 23858, SPELL_HOLY_FIRE = 23860, SPELL_HOLY_WRATH = 23979, + // snake form SPELL_POISON_CLOUD = 23861, SPELL_VENOM_SPIT = 23862, - SPELL_PARASITIC_SERPENT = 23865, SPELL_SUMMON_PARASITIC_SERPENT = 23866, SPELL_PARASITIC_SERPENT_TRIGGER = 23867, + // used when swapping event-stages SPELL_VENOXIS_TRANSFORM = 23849, // 50% health - shapechange to cobra SPELL_FRENZY = 8269 // 20% health - frenzy @@ -63,8 +64,10 @@ enum Events EVENT_HOLY_NOVA = 4, EVENT_HOLY_FIRE = 5, EVENT_HOLY_WRATH = 6, + // phase-changing EVENT_TRANSFORM = 7, + // snake form events EVENT_POISON_CLOUD = 8, EVENT_VENOM_SPIT = 9, @@ -179,11 +182,11 @@ class boss_venoxis : public CreatureScript // troll form spells and Actions (first part) case EVENT_DISPEL_MAGIC: DoCast(me, SPELL_DISPEL_MAGIC); - events.ScheduleEvent(EVENT_DISPEL_MAGIC, urand(15000, 20000), 0, PHASE_ONE); + events.ScheduleEvent(EVENT_DISPEL_MAGIC, 15s, 20s, 0, PHASE_ONE); break; case EVENT_RENEW: DoCast(me, SPELL_RENEW); - events.ScheduleEvent(EVENT_RENEW, urand(25000, 30000), 0, PHASE_ONE); + events.ScheduleEvent(EVENT_RENEW, 25s, 30s, 0, PHASE_ONE); break; case EVENT_HOLY_NOVA: _inMeleeRange = 0; @@ -200,17 +203,17 @@ class boss_venoxis : public CreatureScript if (_inMeleeRange >= 3) DoCastVictim(SPELL_HOLY_NOVA); - events.ScheduleEvent(EVENT_HOLY_NOVA, urand(45000, 75000), 0, PHASE_ONE); + events.ScheduleEvent(EVENT_HOLY_NOVA, 45s, 75s, 0, PHASE_ONE); break; case EVENT_HOLY_FIRE: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) DoCast(target, SPELL_HOLY_FIRE); - events.ScheduleEvent(EVENT_HOLY_FIRE, urand(45000, 60000), 0, PHASE_ONE); + events.ScheduleEvent(EVENT_HOLY_FIRE, 45s, 60s, 0, PHASE_ONE); break; case EVENT_HOLY_WRATH: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) DoCast(target, SPELL_HOLY_WRATH); - events.ScheduleEvent(EVENT_HOLY_WRATH, urand(45000, 60000), 0, PHASE_ONE); + events.ScheduleEvent(EVENT_HOLY_WRATH, 45s, 60s, 0, PHASE_ONE); break; // @@ -220,12 +223,12 @@ class boss_venoxis : public CreatureScript case EVENT_VENOM_SPIT: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) DoCast(target, SPELL_VENOM_SPIT); - events.ScheduleEvent(EVENT_VENOM_SPIT, urand(5000, 15000), 0, PHASE_TWO); + events.ScheduleEvent(EVENT_VENOM_SPIT, 5s, 15s, 0, PHASE_TWO); break; case EVENT_POISON_CLOUD: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) DoCast(target, SPELL_POISON_CLOUD); - events.ScheduleEvent(EVENT_POISON_CLOUD, urand(15000, 20000), 0, PHASE_TWO); + events.ScheduleEvent(EVENT_POISON_CLOUD, 15s, 20s, 0, PHASE_TWO); break; case EVENT_PARASITIC_SERPENT: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp index 7e8dfb3c852..0682cf02e8b 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp @@ -16,27 +16,20 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* ScriptData -SDName: Boss_Wushoolay -SD%Complete: 100 -SDComment: -SDCategory: Zul'Gurub -EndScriptData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" #include "zulgurub.h" +#include "ScriptedCreature.h" +#include "ScriptMgr.h" enum Spells { - SPELL_LIGHTNINGCLOUD = 25033, - SPELL_LIGHTNINGWAVE = 24819 + SPELL_LIGHTNINGCLOUD = 25033, + SPELL_LIGHTNINGWAVE = 24819 }; enum Events { - EVENT_LIGHTNINGCLOUD = 1, - EVENT_LIGHTNINGWAVE = 2 + EVENT_LIGHTNINGCLOUD = 1, + EVENT_LIGHTNINGWAVE = 2 }; class boss_wushoolay : public CreatureScript diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp index 6d634ef4f87..714e70ea129 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp @@ -16,19 +16,11 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* ScriptData -SDName: Instance_ZulGurub -SD%Complete: 80 -SDComment: Missing reset function after killing a boss for Ohgan, Thekal. -SDCategory: Zul'Gurub -EndScriptData */ - -#include "ScriptMgr.h" -#include "Creature.h" +#include "zulgurub.h" #include "GameObject.h" #include "InstanceScript.h" #include "Map.h" -#include "zulgurub.h" +#include "ScriptMgr.h" DoorData const doorData[] = { @@ -38,7 +30,18 @@ DoorData const doorData[] = ObjectData const creatureData[] = { - { NPC_PRIESTESS_MARLI, DATA_MARLI } + { NPC_ZEALOT_LORKHAN, DATA_LORKHAN }, + { NPC_ZEALOT_ZATH, DATA_ZATH }, + { NPC_HIGH_PRIEST_THEKAL, DATA_THEKAL }, + { NPC_JINDO_THE_HEXXER, DATA_JINDO }, + { NPC_ARLOKK, DATA_ARLOKK }, + { NPC_PRIESTESS_MARLI, DATA_MARLI }, + { NPC_VILEBRANCH_SPEAKER, DATA_VILEBRANCH_SPEAKER } +}; + +ObjectData const gameobjectData[] = +{ + { GO_GONG_OF_BETHEKK, DATA_GONG_BETHEKK } }; class instance_zulgurub : public InstanceMapScript @@ -51,7 +54,7 @@ class instance_zulgurub : public InstanceMapScript { SetHeaders(DataHeader); SetBossNumber(EncounterCount); - LoadObjectData(creatureData, nullptr); + LoadObjectData(creatureData, gameobjectData); LoadDoorData(doorData); } @@ -61,33 +64,6 @@ class instance_zulgurub : public InstanceMapScript return false; } - void OnCreatureCreate(Creature* creature) override - { - InstanceScript::OnCreatureCreate(creature); - - switch (creature->GetEntry()) - { - 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_ARLOKK: - _arlokkGUID = creature->GetGUID(); - break; - } - } - void OnGameObjectCreate(GameObject* go) override { InstanceScript::OnGameObjectCreate(go); @@ -95,7 +71,6 @@ class instance_zulgurub : public InstanceMapScript switch (go->GetEntry()) { case GO_GONG_OF_BETHEKK: - _goGongOfBethekkGUID = go->GetGUID(); if (GetBossState(DATA_ARLOKK) == DONE) go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); else @@ -105,44 +80,6 @@ class instance_zulgurub : public InstanceMapScript break; } } - - ObjectGuid GetGuidData(uint32 uiData) const override - { - switch (uiData) - { - case DATA_LORKHAN: - return _zealotLorkhanGUID; - break; - case DATA_ZATH: - return _zealotZathGUID; - break; - case DATA_THEKAL: - return _highPriestTekalGUID; - break; - case DATA_JINDO: - return _jindoTheHexxerGUID; - break; - case NPC_ARLOKK: - return _arlokkGUID; - break; - case GO_GONG_OF_BETHEKK: - return _goGongOfBethekkGUID; - break; - } - return ObjectGuid::Empty; - } - - 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. - - ObjectGuid _zealotLorkhanGUID; - ObjectGuid _zealotZathGUID; - ObjectGuid _highPriestTekalGUID; - ObjectGuid _jindoTheHexxerGUID; - ObjectGuid _vilebranchSpeakerGUID; - ObjectGuid _arlokkGUID; - ObjectGuid _goGongOfBethekkGUID; }; InstanceScript* GetInstanceScript(InstanceMap* map) const override diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h index 3cc5ccda57b..38d958ae4cc 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h +++ b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h @@ -39,7 +39,9 @@ enum ZGDataTypes DATA_EDGE_OF_MADNESS = 9, // Optional Event Edge of Madness - one of: Gri'lek, Renataki, Hazza'rah, or Wushoolay DATA_LORKHAN = 10, // Zealot Lor'Khan add to High priest Thekal! DATA_ZATH = 11, // Zealot Zath add to High priest Thekal! - TYPE_EDGE_OF_MADNESS = 12 // Boss storage + + DATA_GONG_BETHEKK = 12, + DATA_VILEBRANCH_SPEAKER = 13 }; enum ZGCreatureIds |