diff options
| author | DDuarte <dnpd.dd@gmail.com> | 2014-09-07 19:36:33 +0100 |
|---|---|---|
| committer | DDuarte <dnpd.dd@gmail.com> | 2014-09-07 19:36:33 +0100 |
| commit | 6885eb4f2c7cf8941d4018b36a0b522e77092504 (patch) | |
| tree | 054b4e3d945b16dcf769e021ac2538fe7ec587c5 /src/server/scripts/EasternKingdoms | |
| parent | feeb6d4e83b28b9a7f88ac7edc7ed95efd4b6eed (diff) | |
| parent | df7f188cfe1b407520549f7374bfd070d83140e5 (diff) | |
Merge remote-tracking branch 'origin/master' into 4.3.4
Diffstat (limited to 'src/server/scripts/EasternKingdoms')
15 files changed, 360 insertions, 314 deletions
diff --git a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp index 8bc969e9020..87272037755 100644 --- a/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp +++ b/src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp @@ -23,19 +23,16 @@ enum Spells SPELL_ARCANE_EXPLOSION = 46608, SPELL_CONE_OF_COLD = 38384, SPELL_FIREBALL = 46988, - SPELL_FROSTBOLT = 46987 + SPELL_FROSTBOLT = 46987, + SPELL_SUMMON_WATER_ELEMENTAL = 45067, + SPELL_ICEBLOCK = 46604 }; -enum Yells +enum Texts { - YELL_AGGRO = 0, - YELL_EVADE = 1, - YELL_SALVATION = 2, -}; - -enum Creatures -{ - NPC_WATER_ELEMENTAL = 25040 + SAY_AGGRO = 0, + SAY_EVADE = 1, + SAY_SALVATION = 2, }; enum Action @@ -43,64 +40,15 @@ enum Action ACTION_BUFF_YELL = -30001 // shared from Battleground }; -enum WaterElementalSpells +enum Events { - SPELL_WATERBOLT = 46983 -}; - -class npc_water_elemental : public CreatureScript -{ -public: - npc_water_elemental() : CreatureScript("npc_water_elemental") { } - - struct npc_water_elementalAI : public ScriptedAI - { - npc_water_elementalAI(Creature* creature) : ScriptedAI(creature) - { - waterBoltTimer = 3 * IN_MILLISECONDS; - resetTimer = 5 * IN_MILLISECONDS; - balindaGUID = 0; - } - - uint32 waterBoltTimer; - uint64 balindaGUID; - uint32 resetTimer; - - void Reset() override - { - waterBoltTimer = 3 * IN_MILLISECONDS; - resetTimer = 5 * IN_MILLISECONDS; - balindaGUID = 0; - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - if (waterBoltTimer < diff) - { - DoCastVictim(SPELL_WATERBOLT); - waterBoltTimer = 5 * IN_MILLISECONDS; - } else waterBoltTimer -= diff; - - // check if creature is not outside of building - if (resetTimer < diff) - { - if (Creature* pBalinda = ObjectAccessor::GetCreature(*me, balindaGUID)) - if (me->GetDistance2d(pBalinda->GetHomePosition().GetPositionX(), pBalinda->GetHomePosition().GetPositionY()) > 50) - EnterEvadeMode(); - resetTimer = 5 * IN_MILLISECONDS; - } else resetTimer -= diff; - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_water_elementalAI(creature); - } + // Balinda + EVENT_ARCANE_EXPLOSION = 1, + EVENT_CONE_OF_COLD, + EVENT_FIREBOLT, + EVENT_FROSTBOLT, + EVENT_SUMMON_WATER_ELEMENTAL, + EVENT_CHECK_RESET, // Checks if Balinda or the Water Elemental are outside of building. }; class boss_balinda : public CreatureScript @@ -117,23 +65,10 @@ public: void Initialize() { - arcaneExplosionTimer = urand(5 * IN_MILLISECONDS, 15 * IN_MILLISECONDS); - coneOfColdTimer = 8 * IN_MILLISECONDS; - fireBoltTimer = 1 * IN_MILLISECONDS; - frostboltTimer = 4 * IN_MILLISECONDS; - resetTimer = 5 * IN_MILLISECONDS; - waterElementalTimer = 0; + WaterElementalGUID = 0; + HasCastIceblock = false; } - uint32 arcaneExplosionTimer; - uint32 coneOfColdTimer; - uint32 fireBoltTimer; - uint32 frostboltTimer; - uint32 resetTimer; - uint32 waterElementalTimer; - - SummonList summons; - void Reset() override { Initialize(); @@ -143,22 +78,28 @@ public: void EnterCombat(Unit* /*who*/) override { - Talk(YELL_AGGRO); - } - - void JustRespawned() override - { - Reset(); + Talk(SAY_AGGRO); + events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, urand(5 * IN_MILLISECONDS, 15 * IN_MILLISECONDS)); + events.ScheduleEvent(EVENT_CONE_OF_COLD, 8 * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_FIREBOLT, 1 * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_FROSTBOLT, 4 * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_SUMMON_WATER_ELEMENTAL, 3 * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_CHECK_RESET, 5 * IN_MILLISECONDS); } void JustSummoned(Creature* summoned) override { - ENSURE_AI(npc_water_elemental::npc_water_elementalAI, summoned->AI())->balindaGUID = me->GetGUID(); summoned->AI()->AttackStart(SelectTarget(SELECT_TARGET_RANDOM, 0, 50, true)); summoned->setFaction(me->getFaction()); + WaterElementalGUID = summoned->GetGUID(); summons.Summon(summoned); } + void SummonedCreatureDespawn(Creature* summoned) override + { + summons.Despawn(summoned); + } + void JustDied(Unit* /*killer*/) override { summons.DespawnAll(); @@ -167,7 +108,16 @@ public: void DoAction(int32 actionId) override { if (actionId == ACTION_BUFF_YELL) - Talk(YELL_AGGRO); + Talk(SAY_AGGRO); + } + + void DamageTaken(Unit* /*attacker*/, uint32& damage) override + { + if (me->HealthBelowPctDamaged(40, damage) && !HasCastIceblock) + { + DoCast(SPELL_ICEBLOCK); + HasCastIceblock = true; + } } void UpdateAI(uint32 diff) override @@ -175,50 +125,60 @@ public: if (!UpdateVictim()) return; - if (waterElementalTimer < diff) - { - if (summons.empty()) - me->SummonCreature(NPC_WATER_ELEMENTAL, 0, 0, 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 45 * IN_MILLISECONDS); - waterElementalTimer = 50 * IN_MILLISECONDS; - } else waterElementalTimer -= diff; - - if (arcaneExplosionTimer < diff) - { - DoCastVictim(SPELL_ARCANE_EXPLOSION); - arcaneExplosionTimer = urand(5 * IN_MILLISECONDS, 15 * IN_MILLISECONDS); - } else arcaneExplosionTimer -= diff; - - if (coneOfColdTimer < diff) - { - DoCastVictim(SPELL_CONE_OF_COLD); - coneOfColdTimer = urand(10 * IN_MILLISECONDS, 20 * IN_MILLISECONDS); - } else coneOfColdTimer -= diff; - - if (fireBoltTimer < diff) - { - DoCastVictim(SPELL_FIREBALL); - fireBoltTimer = urand(5 * IN_MILLISECONDS, 9 * IN_MILLISECONDS); - } else fireBoltTimer -= diff; + events.Update(diff); - if (frostboltTimer < diff) - { - DoCastVictim(SPELL_FROSTBOLT); - frostboltTimer = urand(4 * IN_MILLISECONDS, 12 * IN_MILLISECONDS); - } else frostboltTimer -= diff; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - // check if creature is not outside of building - if (resetTimer < diff) + while (uint32 eventId = events.ExecuteEvent()) { - if (me->GetDistance2d(me->GetHomePosition().GetPositionX(), me->GetHomePosition().GetPositionY()) > 50) + switch (eventId) { - EnterEvadeMode(); - Talk(YELL_EVADE); + case EVENT_ARCANE_EXPLOSION: + DoCastVictim(SPELL_ARCANE_EXPLOSION); + events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, urand(5 * IN_MILLISECONDS, 15 * IN_MILLISECONDS)); + break; + case EVENT_CONE_OF_COLD: + DoCastVictim(SPELL_CONE_OF_COLD); + events.ScheduleEvent(EVENT_CONE_OF_COLD, urand(10 * IN_MILLISECONDS, 20 * IN_MILLISECONDS)); + break; + case EVENT_FIREBOLT: + DoCastVictim(SPELL_FIREBALL); + events.ScheduleEvent(EVENT_FIREBOLT, urand(5 * IN_MILLISECONDS, 9 * IN_MILLISECONDS)); + break; + case EVENT_FROSTBOLT: + DoCastVictim(SPELL_FROSTBOLT); + events.ScheduleEvent(EVENT_FROSTBOLT, urand(4 * IN_MILLISECONDS, 12 * IN_MILLISECONDS)); + break; + case EVENT_SUMMON_WATER_ELEMENTAL: + if (summons.empty()) + DoCast(SPELL_SUMMON_WATER_ELEMENTAL); + events.ScheduleEvent(EVENT_SUMMON_WATER_ELEMENTAL, 50 * IN_MILLISECONDS); + break; + case EVENT_CHECK_RESET: + if (me->GetDistance2d(me->GetHomePosition().GetPositionX(), me->GetHomePosition().GetPositionY()) > 50) + { + EnterEvadeMode(); + Talk(SAY_EVADE); + } + if (Creature* elemental = ObjectAccessor::GetCreature(*me, WaterElementalGUID)) + if (elemental->GetDistance2d(me->GetHomePosition().GetPositionX(), me->GetHomePosition().GetPositionY()) > 50) + elemental->AI()->EnterEvadeMode(); + events.ScheduleEvent(EVENT_CHECK_RESET, 5 * IN_MILLISECONDS); + break; + default: + break; } - resetTimer = 5 * IN_MILLISECONDS; - } else resetTimer -= diff; + } DoMeleeAttackIfReady(); } + + private: + EventMap events; + SummonList summons; + uint64 WaterElementalGUID; + bool HasCastIceblock; }; CreatureAI* GetAI(Creature* creature) const override @@ -230,5 +190,4 @@ public: void AddSC_boss_balinda() { new boss_balinda; - new npc_water_elemental; } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp index 1a97f668558..9a6d0e9c224 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp @@ -75,6 +75,9 @@ public: { Initialize(); + Breath1_Spell = 0; + Breath2_Spell = 0; + // Select the 2 breaths that we are going to use until despawned // 5 possiblities for the first breath, 4 for the second, 20 total possiblites // This way we don't end up casting 2 of the same breath diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp index 9084a6b0371..7ce11653567 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp @@ -81,6 +81,9 @@ public: Initialize(); instance = creature->GetInstanceScript(); Intro = true; + RainBones = false; + Skeletons = false; + FlyTimer = 0; } void Initialize() diff --git a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp index ce8223c90cf..7b51b61ba0a 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp @@ -1068,6 +1068,7 @@ public: EntryYellTimer = 1000; AggroYellTimer = 10000; IsFakingDeath = false; + ResurrectTimer = 0; } void Initialize() diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp index 03ca73fed1f..6c48ee7f348 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp @@ -412,7 +412,7 @@ class npc_eye_of_acherus : public CreatureScript { if (movementType == WAYPOINT_MOTION_TYPE && pointId == POINT_EYE_MOVE_END - 1) { - me->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE); + me->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE); me->RemoveAllAuras(); if (Player* owner = me->GetCharmerOrOwner()->ToPlayer()) diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp index 307bcd5add6..0733640f4c3 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp @@ -391,6 +391,10 @@ public: Initialize(); instance = creature->GetInstanceScript(); headGUID = 0; + PlayerGUID = 0; + id = 0; + whirlwind = 0; + wp_reached = false; } void Initialize() diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp index c05de1bb800..3e752858e63 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp @@ -1,6 +1,5 @@ /* * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/> * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -16,13 +15,6 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* ScriptData -SDName: Boss_Interrogator_Vishas -SD%Complete: 100 -SDComment: -SDCategory: Scarlet Monastery -EndScriptData */ - #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "scarlet_monastery.h" @@ -38,94 +30,93 @@ enum Says enum Spells { - SPELL_SHADOWWORDPAIN = 2767 + SPELL_SHADOW_WORD_PAIN = 2767 }; -class boss_interrogator_vishas : public CreatureScript +enum Events { -public: - boss_interrogator_vishas() : CreatureScript("boss_interrogator_vishas") { } - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<boss_interrogator_vishasAI>(creature); - } - - struct boss_interrogator_vishasAI : public ScriptedAI - { - boss_interrogator_vishasAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - instance = me->GetInstanceScript(); - } - - void Initialize() - { - ShadowWordPain_Timer = 5000; - Yell60 = false; - Yell30 = false; - } - - InstanceScript* instance; + EVENT_SHADOW_WORD_PAIN = 1 +}; - bool Yell30; - bool Yell60; - uint32 ShadowWordPain_Timer; +class boss_interrogator_vishas : public CreatureScript +{ + public: + boss_interrogator_vishas() : CreatureScript("boss_interrogator_vishas") { } - void Reset() override + struct boss_interrogator_vishasAI : public BossAI { - Initialize(); - instance->SetBossState(DATA_INTERROGATOR_VISHAS, NOT_STARTED); - } + boss_interrogator_vishasAI(Creature* creature) : BossAI(creature, DATA_INTERROGATOR_VISHAS) + { + Initialize(); + } - void EnterCombat(Unit* /*who*/) override - { - Talk(SAY_AGGRO); - instance->SetBossState(DATA_INTERROGATOR_VISHAS, IN_PROGRESS); - } + void Initialize() + { + _yellCount = 0; + } - void KilledUnit(Unit* /*Victim*/) override - { - Talk(SAY_KILL); - } + void Reset() override + { + Initialize(); + _Reset(); + } - void JustDied(Unit* /*killer*/) override - { - //Any other Actions to do with vorrel? setStandState? - if (Creature* vorrel = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_VORREL))) - vorrel->AI()->Talk(SAY_TRIGGER_VORREL); - instance->SetBossState(DATA_INTERROGATOR_VISHAS, DONE); - } + void EnterCombat(Unit* /*who*/) override + { + Talk(SAY_AGGRO); + _EnterCombat(); + events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 5000); + } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + void KilledUnit(Unit* victim) override + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); + } - //If we are low on hp Do sayings - if (!Yell60 && !HealthAbovePct(60)) + void JustDied(Unit* /*killer*/) override { - Talk(SAY_HEALTH1); - Yell60 = true; + _JustDied(); + if (Creature* vorrel = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_VORREL))) + vorrel->AI()->Talk(SAY_TRIGGER_VORREL); } - if (!Yell30 && !HealthAbovePct(30)) + void DamageTaken(Unit* /*attacker*/, uint32 &damage) override { - Talk(SAY_HEALTH2); - Yell30 = true; + if (me->HealthBelowPctDamaged(60, damage) && _yellCount < 1) + { + Talk(SAY_HEALTH1); + ++_yellCount; + } + + if (me->HealthBelowPctDamaged(30, damage) && _yellCount < 2) + { + Talk(SAY_HEALTH2); + ++_yellCount; + } } - //ShadowWordPain_Timer - if (ShadowWordPain_Timer <= diff) + void ExecuteEvent(uint32 eventId) override { - DoCastVictim(SPELL_SHADOWWORDPAIN); - ShadowWordPain_Timer = urand(5000, 15000); + switch (eventId) + { + case EVENT_SHADOW_WORD_PAIN: + DoCastVictim(SPELL_SHADOW_WORD_PAIN); + events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, urand(5000, 15000)); + break; + default: + break; + } } - else ShadowWordPain_Timer -= diff; - DoMeleeAttackIfReady(); + private: + uint8 _yellCount; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<boss_interrogator_vishasAI>(creature); } - }; }; void AddSC_boss_interrogator_vishas() diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp index 44885a01270..b218e3f2978 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp @@ -105,7 +105,7 @@ public: DoMeleeAttackIfReady(); } - + private: EventMap events; SummonList Summons; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp index 3864c598459..099a69782b8 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp @@ -1,6 +1,5 @@ /* * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/> * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -16,20 +15,31 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* ScriptData -SDName: Boss_Kormok -SD%Complete: 100 -SDComment: -SDCategory: Scholomance -EndScriptData */ - #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "SpellScript.h" +#include "scholomance.h" enum Spells { - SPELL_SHADOWBOLTVOLLEY = 20741, - SPELL_BONESHIELD = 27688 + SPELL_SHADOWBOLT_VOLLEY = 20741, + SPELL_BONE_SHIELD = 27688, + + SPELL_SUMMON_BONE_MAGES = 27695, + + SPELL_SUMMON_BONE_MAGE_FRONT_LEFT = 27696, + SPELL_SUMMON_BONE_MAGE_FRONT_RIGHT = 27697, + SPELL_SUMMON_BONE_MAGE_BACK_RIGHT = 27698, + SPELL_SUMMON_BONE_MAGE_BACK_LEFT = 27699, + + SPELL_SUMMON_BONE_MINIONS = 27687 +}; + +enum Events +{ + EVENT_SHADOWBOLT_VOLLEY = 1, + EVENT_BONE_SHIELD, + EVENT_SUMMON_MINIONS }; class boss_kormok : public CreatureScript @@ -37,11 +47,6 @@ class boss_kormok : public CreatureScript public: boss_kormok() : CreatureScript("boss_kormok") { } - CreatureAI* GetAI(Creature* creature) const override - { - return new boss_kormokAI(creature); - } - struct boss_kormokAI : public ScriptedAI { boss_kormokAI(Creature* creature) : ScriptedAI(creature) @@ -51,38 +56,34 @@ public: void Initialize() { - ShadowVolley_Timer = 10000; - BoneShield_Timer = 2000; - Minion_Timer = 15000; - Mage_Timer = 0; Mages = false; } - uint32 ShadowVolley_Timer; - uint32 BoneShield_Timer; - uint32 Minion_Timer; - uint32 Mage_Timer; - bool Mages; - void Reset() override { Initialize(); + events.Reset(); } void EnterCombat(Unit* /*who*/) override { + events.ScheduleEvent(EVENT_SHADOWBOLT_VOLLEY, 10000); + events.ScheduleEvent(EVENT_BONE_SHIELD, 2000); + events.ScheduleEvent(EVENT_SUMMON_MINIONS, 15000); } - void SummonMinions(Unit* victim) + void JustSummoned(Creature* summoned) override { - if (Creature* SummonedMinion = DoSpawnCreature(16119, float(irand(-7, 7)), float(irand(-7, 7)), 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 120000)) - SummonedMinion->AI()->AttackStart(victim); + summoned->AI()->AttackStart(me->GetVictim()); } - void SummonMages(Unit* victim) + void DamageTaken(Unit* /*attacker*/, uint32& damage) override { - if (Creature* SummonedMage = DoSpawnCreature(16120, float(irand(-9, 9)), float(irand(-9, 9)), 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 120000)) - SummonedMage->AI()->AttackStart(victim); + if (me->HealthBelowPctDamaged(25, damage) && !Mages) + { + DoCast(SPELL_SUMMON_BONE_MAGES); + Mages = true; + } } void UpdateAI(uint32 diff) override @@ -90,48 +91,132 @@ public: if (!UpdateVictim()) return; - //ShadowVolley_Timer - if (ShadowVolley_Timer <= diff) - { - DoCastVictim(SPELL_SHADOWBOLTVOLLEY); - ShadowVolley_Timer = 15000; - } else ShadowVolley_Timer -= diff; + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - //BoneShield_Timer - if (BoneShield_Timer <= diff) + while (uint32 eventId = events.ExecuteEvent()) { - DoCastVictim(SPELL_BONESHIELD); - BoneShield_Timer = 45000; - } else BoneShield_Timer -= diff; + switch (eventId) + { + case EVENT_SHADOWBOLT_VOLLEY: + DoCastVictim(SPELL_SHADOWBOLT_VOLLEY); + events.ScheduleEvent(EVENT_SHADOWBOLT_VOLLEY, 15000); + break; + case EVENT_BONE_SHIELD: + DoCastVictim(SPELL_BONE_SHIELD); + events.ScheduleEvent(EVENT_BONE_SHIELD, 45000); + break; + case EVENT_SUMMON_MINIONS: + DoCast(SPELL_SUMMON_BONE_MINIONS); + events.ScheduleEvent(EVENT_SUMMON_MINIONS, 12000); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + + private: + EventMap events; + bool Mages; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new boss_kormokAI(creature); + } +}; - //Minion_Timer - if (Minion_Timer <= diff) +uint32 const SummonMageSpells[4] = +{ + SPELL_SUMMON_BONE_MAGE_FRONT_LEFT, + SPELL_SUMMON_BONE_MAGE_FRONT_RIGHT, + SPELL_SUMMON_BONE_MAGE_BACK_RIGHT, + SPELL_SUMMON_BONE_MAGE_BACK_LEFT, +}; + +// 27695 - Summon Bone Mages +class spell_kormok_summon_bone_mages : SpellScriptLoader +{ + public: + spell_kormok_summon_bone_mages() : SpellScriptLoader("spell_kormok_summon_bone_mages") { } + + class spell_kormok_summon_bone_magesSpellScript : public SpellScript + { + PrepareSpellScript(spell_kormok_summon_bone_magesSpellScript); + + bool Validate(SpellInfo const* /*spell*/) override { - //Cast - SummonMinions(me->GetVictim()); - SummonMinions(me->GetVictim()); - SummonMinions(me->GetVictim()); - SummonMinions(me->GetVictim()); + for (uint32 i = 0; i < 4; ++i) + if (!sSpellMgr->GetSpellInfo(SummonMageSpells[i])) + return false; + return true; + } - Minion_Timer = 12000; - } else Minion_Timer -= diff; + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + for (uint32 i = 0; i < 2; ++i) + GetCaster()->CastSpell(GetCaster(), SummonMageSpells[urand(0, 3)], true); + } - //Summon 2 Bone Mages - if (!Mages && HealthBelowPct(26)) + void Register() override { - //Cast - SummonMages(me->GetVictim()); - SummonMages(me->GetVictim()); - Mages = true; + OnEffectHitTarget += SpellEffectFn(spell_kormok_summon_bone_magesSpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } + }; - DoMeleeAttackIfReady(); + SpellScript* GetSpellScript() const override + { + return new spell_kormok_summon_bone_magesSpellScript(); + } +}; + +// 27687 - Summon Bone Minions +class spell_kormok_summon_bone_minions : SpellScriptLoader +{ + public: + spell_kormok_summon_bone_minions() : SpellScriptLoader("spell_kormok_summon_bone_minions") { } + + class spell_kormok_summon_bone_minionsSpellScript : public SpellScript + { + PrepareSpellScript(spell_kormok_summon_bone_minionsSpellScript); + + bool Validate(SpellInfo const* /*spell*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_SUMMON_BONE_MINIONS)) + return false; + return true; + } + + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + + // Possible spells to handle this not found. + for (uint32 i = 0; i < 4; ++i) + GetCaster()->SummonCreature(NPC_BONE_MINION, GetCaster()->GetPositionX() + float(irand(-7, 7)), GetCaster()->GetPositionY() + float(irand(-7, 7)), GetCaster()->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 120000); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_kormok_summon_bone_minionsSpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; + SpellScript* GetSpellScript() const override + { + return new spell_kormok_summon_bone_minionsSpellScript(); + } }; void AddSC_boss_kormok() { new boss_kormok(); + new spell_kormok_summon_bone_mages(); + new spell_kormok_summon_bone_minions(); } diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp index 41873d778ca..897799a708c 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp @@ -53,8 +53,8 @@ public: DoCast(me, SPELL_ICE_ARMOR); } - void EnterCombat(Unit* /*who*/) override - { + void EnterCombat(Unit* /*who*/) override + { events.ScheduleEvent(EVENT_ICE_ARMOR, 2000); events.ScheduleEvent(EVENT_FROSTBOLT, 8000); events.ScheduleEvent(EVENT_CHILL_NOVA, 12000); @@ -108,7 +108,7 @@ public: DoMeleeAttackIfReady(); } - + private: EventMap events; }; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp index 654f06ad3ed..792649f2998 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp @@ -101,7 +101,7 @@ public: DoMeleeAttackIfReady(); } - + private: EventMap events; }; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h b/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h index 4b587bb6dde..30d0e978145 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h +++ b/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h @@ -36,7 +36,8 @@ enum DataTypes enum CreatureIds { - NPC_DARKMASTER_GANDLING = 1853 + NPC_DARKMASTER_GANDLING = 1853, + NPC_BONE_MINION = 16119 }; enum GameobjectIds diff --git a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp index 01ee7139ae5..889fbe8fdc9 100644 --- a/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp +++ b/src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp @@ -81,38 +81,6 @@ public: }; /*###### -## npc_freed_soul -######*/ -enum FreedSoul -{ - SAY_ZAPPED = 0 -}; - -class npc_freed_soul : public CreatureScript -{ -public: - npc_freed_soul() : CreatureScript("npc_freed_soul") { } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_freed_soulAI(creature); - } - - struct npc_freed_soulAI : public ScriptedAI - { - npc_freed_soulAI(Creature* creature) : ScriptedAI(creature) { } - - void Reset() override - { - Talk(SAY_ZAPPED); - } - - void EnterCombat(Unit* /*who*/) override { } - }; - -}; - -/*###### ## npc_restless_soul ######*/ @@ -181,6 +149,9 @@ public: void JustSummoned(Creature* summoned) override { summoned->CastSpell(summoned, SPELL_SOUL_FREED, false); + + if (Player* player = ObjectAccessor::GetPlayer(*me, Tagger)) + summoned->GetMotionMaster()->MoveFollow(player, 0.0f, 0.0f); } void JustDied(Unit* /*killer*/) override @@ -318,7 +289,6 @@ public: void AddSC_stratholme() { new go_gauntlet_gate(); - new npc_freed_soul(); new npc_restless_soul(); new npc_spectral_ghostly_citizen(); } diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp index 5df2d683e21..79ebfa7b62b 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp @@ -503,6 +503,7 @@ public: { Initialize(); instance = creature->GetInstanceScript(); + speechPhaseEnd = 0; SetCombatMovement(false); } diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp index ec0bae0f27f..823423fc3a8 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp @@ -301,10 +301,19 @@ public: { npc_muru_portalAI(Creature* creature) : ScriptedAI(creature), Summons(creature) { + Initialize(); SetCombatMovement(false); instance = creature->GetInstanceScript(); } + void Initialize() + { + SummonTimer = 5000; + + InAction = false; + SummonSentinel = false; + } + InstanceScript* instance; SummonList Summons; @@ -316,10 +325,7 @@ public: void Reset() override { - SummonTimer = 5000; - - InAction = false; - SummonSentinel = false; + Initialize(); me->AddUnitState(UNIT_STATE_STUNNED); @@ -383,15 +389,23 @@ public: struct npc_dark_fiendAI : public ScriptedAI { - npc_dark_fiendAI(Creature* creature) : ScriptedAI(creature) { } + npc_dark_fiendAI(Creature* creature) : ScriptedAI(creature) + { + Initialize(); + } + + void Initialize() + { + WaitTimer = 2000; + InAction = false; + } uint32 WaitTimer; bool InAction; void Reset() override { - WaitTimer = 2000; - InAction = false; + Initialize(); me->AddUnitState(UNIT_STATE_STUNNED); } @@ -444,15 +458,23 @@ public: struct npc_void_sentinelAI : public ScriptedAI { - npc_void_sentinelAI(Creature* creature) : ScriptedAI(creature) { } + npc_void_sentinelAI(Creature* creature) : ScriptedAI(creature) + { + Initialize(); + } + + void Initialize() + { + PulseTimer = 3000; + VoidBlastTimer = 45000; //is this a correct timer? + } uint32 PulseTimer; uint32 VoidBlastTimer; void Reset() override { - PulseTimer = 3000; - VoidBlastTimer = 45000; //is this a correct timer? + Initialize(); float x, y, z, o; me->GetHomePosition(x, y, z, o); @@ -502,9 +524,18 @@ public: { npc_blackholeAI(Creature* creature) : ScriptedAI(creature) { + Initialize(); instance = creature->GetInstanceScript(); } + void Initialize() + { + DespawnTimer = 15000; + SpellTimer = 5000; + Phase = 0; + NeedForAHack = 0; + } + InstanceScript* instance; uint32 DespawnTimer; @@ -514,10 +545,7 @@ public: void Reset() override { - DespawnTimer = 15000; - SpellTimer = 5000; - Phase = 0; - NeedForAHack = 0; + Initialize(); me->AddUnitState(UNIT_STATE_STUNNED); DoCastAOE(SPELL_BLACKHOLE_SPAWN, true); |
