aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts/EasternKingdoms
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/scripts/EasternKingdoms')
-rw-r--r--src/server/scripts/EasternKingdoms/AlteracValley/boss_balinda.cpp213
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp3
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp3
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp141
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp201
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp6
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/scholomance.h3
-rw-r--r--src/server/scripts/EasternKingdoms/Stratholme/stratholme.cpp36
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp56
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);