mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-24 19:06:49 +01:00
Scripts/Scholomance: Update scripts (#31333)
This commit is contained in:
27
sql/updates/world/3.3.5/2025_11_08_01_world.sql
Normal file
27
sql/updates/world/3.3.5/2025_11_08_01_world.sql
Normal file
@@ -0,0 +1,27 @@
|
||||
--
|
||||
DELETE FROM `creature_text` WHERE `CreatureID` = 16118;
|
||||
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
|
||||
(16118,0,0,"You think you can summon us? We are the ones that summon, not you! We bash you good for this and suck the marrow from your bones!",14,0,100,0,0,0,11968,0,"Kormok SAY_SPAWN"),
|
||||
(16118,1,0,"First Kormok crush your bones! Then Kormok burn your soul!",12,0,100,0,0,0,11958,0,"Kormok SAY_AGGRO"),
|
||||
(16118,1,1,"You so little and puny... you no make good servants for Kormok!",12,0,100,0,0,0,11959,0,"Kormok SAY_AGGRO"),
|
||||
(16118,2,0,"We am free! Thank you little, puny ones.",14,0,100,0,0,0,11873,0,"Kormok SAY_DEATH"),
|
||||
(16118,3,0,"%s goes into a frenzy!",16,0,100,0,0,0,10645,0,"Kormok EMOTE_FRENZY");
|
||||
|
||||
DELETE FROM `creature_text` WHERE `CreatureID` = 10432;
|
||||
|
||||
DELETE FROM `creature_text` WHERE `CreatureID` = 14516;
|
||||
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
|
||||
(14516,0,0,"ENOUGH - this ends now! You fools will be added to my bone collection!",14,0,100,0,0,0,9784,0,"Death Knight Darkreaver");
|
||||
|
||||
DELETE FROM `creature_text` WHERE `CreatureID` = 11261;
|
||||
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
|
||||
(11261,0,0,"The doctor is in!",12,0,100,0,0,0,6715,0,"Doctor Theolen Krastinov SAY_AGGRO"),
|
||||
(11261,1,0,"%s goes into a frenzy!",16,0,100,0,0,0,10645,0,"Doctor Theolen Krastinov EMOTE_FRENZY");
|
||||
|
||||
DELETE FROM `creature_text` WHERE `CreatureID` = 10503;
|
||||
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
|
||||
(10503,0,0,"%s loosens her grasp on the journal she had been clutching.",16,0,100,0,0,0,11408,0,"Jandice Barov");
|
||||
|
||||
UPDATE `waypoint_data` SET `move_type` = 1 WHERE `id` = 105061;
|
||||
|
||||
UPDATE `creature_template` SET `unit_flags` = 832, `flags_extra` = `flags_extra`|512 WHERE `entry` = 10506;
|
||||
@@ -15,13 +15,35 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Timers requires to be revisited
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "scholomance.h"
|
||||
#include "ScriptedCreature.h"
|
||||
|
||||
enum DarkreaverTexts
|
||||
{
|
||||
SAY_SPAWN = 0
|
||||
};
|
||||
|
||||
enum DarkreaverSpells
|
||||
{
|
||||
SUMMON_FALLEN_CHARGER = 23261
|
||||
SPELL_SHADOW_BOLT = 17393,
|
||||
SPELL_CLEAVE = 15284,
|
||||
SPELL_BLOOD_LEECH = 22644,
|
||||
SPELL_DOMINATE_MIND = 7645,
|
||||
|
||||
SPELL_SUMMON_FALLEN_CHARGER = 23261
|
||||
};
|
||||
|
||||
enum DarkreaverEvents
|
||||
{
|
||||
EVENT_SHADOW_BOLT = 1,
|
||||
EVENT_CLEAVE,
|
||||
EVENT_BLOOD_LEECH,
|
||||
EVENT_DOMINATE_MIND
|
||||
};
|
||||
|
||||
// 14516 - Death Knight Darkreaver
|
||||
@@ -29,18 +51,73 @@ struct boss_death_knight_darkreaver : public ScriptedAI
|
||||
{
|
||||
boss_death_knight_darkreaver(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
void Reset() override
|
||||
void JustAppeared() override
|
||||
{
|
||||
Talk(SAY_SPAWN);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
void Reset() override
|
||||
{
|
||||
DoCastSelf(SUMMON_FALLEN_CHARGER, true);
|
||||
_events.Reset();
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
{
|
||||
_events.ScheduleEvent(EVENT_SHADOW_BOLT, 0s);
|
||||
_events.ScheduleEvent(EVENT_CLEAVE, 5s, 10s);
|
||||
_events.ScheduleEvent(EVENT_BLOOD_LEECH, 10s, 15s);
|
||||
_events.ScheduleEvent(EVENT_DOMINATE_MIND, 10s, 15s);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
DoCastSelf(SPELL_SUMMON_FALLEN_CHARGER, true);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
_events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = _events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_SHADOW_BOLT:
|
||||
DoCastVictim(SPELL_SHADOW_BOLT);
|
||||
_events.Repeat(5s, 10s);
|
||||
break;
|
||||
case EVENT_CLEAVE:
|
||||
DoCastVictim(SPELL_CLEAVE);
|
||||
_events.Repeat(5s, 10s);
|
||||
break;
|
||||
case EVENT_BLOOD_LEECH:
|
||||
DoCastSelf(SPELL_BLOOD_LEECH);
|
||||
_events.Repeat(15s, 25s);
|
||||
break;
|
||||
case EVENT_DOMINATE_MIND:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1))
|
||||
DoCast(target, SPELL_DOMINATE_MIND);
|
||||
_events.Repeat(15s, 20s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap _events;
|
||||
};
|
||||
|
||||
void AddSC_boss_death_knight_darkreaver()
|
||||
|
||||
@@ -15,13 +15,19 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Timers requires to be revisited
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "scholomance.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "SpellInfo.h"
|
||||
|
||||
enum TheolenTexts
|
||||
{
|
||||
EMOTE_FRENZY_KILL = 0
|
||||
SAY_AGGRO = 0,
|
||||
EMOTE_FRENZY = 1
|
||||
};
|
||||
|
||||
enum TheolenSpells
|
||||
@@ -33,7 +39,7 @@ enum TheolenSpells
|
||||
|
||||
enum TheolenEvents
|
||||
{
|
||||
EVENT_REND = 1,
|
||||
EVENT_REND = 1,
|
||||
EVENT_BACKHAND,
|
||||
EVENT_FRENZY
|
||||
};
|
||||
@@ -41,14 +47,37 @@ enum TheolenEvents
|
||||
// 11261 - Doctor Theolen Krastinov
|
||||
struct boss_doctor_theolen_krastinov : public BossAI
|
||||
{
|
||||
boss_doctor_theolen_krastinov(Creature* creature) : BossAI(creature, DATA_DOCTOR_THEOLEN_KRASTINOV) { }
|
||||
boss_doctor_theolen_krastinov(Creature* creature) : BossAI(creature, DATA_DOCTOR_THEOLEN_KRASTINOV), _frenzied(false) { }
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_Reset();
|
||||
_frenzied = false;
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
events.ScheduleEvent(EVENT_REND, 8s);
|
||||
events.ScheduleEvent(EVENT_BACKHAND, 9s);
|
||||
events.ScheduleEvent(EVENT_FRENZY, 1s);
|
||||
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_REND, 5s, 15s);
|
||||
events.ScheduleEvent(EVENT_BACKHAND, 5s, 15s);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
|
||||
{
|
||||
if (!_frenzied && me->HealthBelowPctDamaged(50, damage))
|
||||
{
|
||||
_frenzied = true;
|
||||
events.ScheduleEvent(EVENT_FRENZY, 0s);
|
||||
}
|
||||
}
|
||||
|
||||
void OnSpellCast(SpellInfo const* spell) override
|
||||
{
|
||||
if (spell->Id == SPELL_FRENZY)
|
||||
Talk(EMOTE_FRENZY);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -67,16 +96,14 @@ struct boss_doctor_theolen_krastinov : public BossAI
|
||||
{
|
||||
case EVENT_REND:
|
||||
DoCastVictim(SPELL_REND);
|
||||
events.Repeat(10s);
|
||||
events.Repeat(15s, 20s);
|
||||
break;
|
||||
case EVENT_BACKHAND:
|
||||
DoCastVictim(SPELL_BACKHAND);
|
||||
events.Repeat(10s);
|
||||
events.Repeat(10s, 20s);
|
||||
break;
|
||||
case EVENT_FRENZY:
|
||||
DoCastSelf(SPELL_FRENZY);
|
||||
Talk(EMOTE_FRENZY_KILL);
|
||||
events.Repeat(120s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -88,6 +115,9 @@ struct boss_doctor_theolen_krastinov : public BossAI
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
bool _frenzied;
|
||||
};
|
||||
|
||||
void AddSC_boss_theolenkrastinov()
|
||||
|
||||
@@ -15,6 +15,10 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Timers requires to be revisited
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "scholomance.h"
|
||||
#include "ScriptedCreature.h"
|
||||
@@ -22,18 +26,19 @@
|
||||
enum IlluciaSpells
|
||||
{
|
||||
SPELL_CURSE_OF_AGONY = 18671,
|
||||
SPELL_DOMINATE = 7645, // UNUSED YET added for documentation
|
||||
SPELL_DOMINATE_MIND = 14515,
|
||||
SPELL_FEAR = 12542,
|
||||
SPELL_SHADOW_SHOCK = 17234,
|
||||
SPELL_SHADOW_SHOCK = 17289,
|
||||
SPELL_SILENCE = 12528
|
||||
};
|
||||
|
||||
enum IlluciaEvents
|
||||
{
|
||||
EVENT_CURSE_OF_AGONY = 1,
|
||||
EVENT_CURSE_OF_AGONY = 1,
|
||||
EVENT_DOMINATE_MIND,
|
||||
EVENT_FEAR,
|
||||
EVENT_SHADOW_SHOCK,
|
||||
EVENT_SILENCE,
|
||||
EVENT_FEAR
|
||||
EVENT_SILENCE
|
||||
};
|
||||
|
||||
// 10502 - Lady Illucia Barov
|
||||
@@ -44,10 +49,12 @@ struct boss_illucia_barov : public BossAI
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
events.ScheduleEvent(EVENT_CURSE_OF_AGONY, 18s);
|
||||
events.ScheduleEvent(EVENT_SHADOW_SHOCK, 9s);
|
||||
events.ScheduleEvent(EVENT_SILENCE, 5s);
|
||||
events.ScheduleEvent(EVENT_FEAR, 30s);
|
||||
|
||||
events.ScheduleEvent(EVENT_CURSE_OF_AGONY, 10s, 20s);
|
||||
events.ScheduleEvent(EVENT_DOMINATE_MIND, 15s, 25s);
|
||||
events.ScheduleEvent(EVENT_FEAR, 15s, 30s);
|
||||
events.ScheduleEvent(EVENT_SHADOW_SHOCK, 10s, 15s);
|
||||
events.ScheduleEvent(EVENT_SILENCE, 10s, 15s);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -65,20 +72,26 @@ struct boss_illucia_barov : public BossAI
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_CURSE_OF_AGONY:
|
||||
DoCastVictim(SPELL_CURSE_OF_AGONY);
|
||||
events.Repeat(30s);
|
||||
DoCastSelf(SPELL_CURSE_OF_AGONY);
|
||||
events.Repeat(20s, 30s);
|
||||
break;
|
||||
case EVENT_DOMINATE_MIND:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1))
|
||||
DoCast(target, SPELL_DOMINATE_MIND);
|
||||
events.Repeat(25s, 40s);
|
||||
break;
|
||||
case EVENT_FEAR:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
DoCast(target, SPELL_FEAR);
|
||||
events.Repeat(15s, 25s);
|
||||
break;
|
||||
case EVENT_SHADOW_SHOCK:
|
||||
DoCast(SelectTarget(SelectTargetMethod::Random, 0, 100, true), SPELL_SHADOW_SHOCK);
|
||||
events.Repeat(12s);
|
||||
DoCastVictim(SPELL_SHADOW_SHOCK);
|
||||
events.Repeat(10s, 15s);
|
||||
break;
|
||||
case EVENT_SILENCE:
|
||||
DoCastSelf(SPELL_SILENCE);
|
||||
events.Repeat(14s);
|
||||
break;
|
||||
case EVENT_FEAR:
|
||||
DoCastVictim(SPELL_FEAR);
|
||||
events.Repeat(30s);
|
||||
events.Repeat(20s, 30s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
@@ -15,6 +15,10 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Timers requires to be revisited
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "scholomance.h"
|
||||
#include "ScriptedCreature.h"
|
||||
@@ -22,52 +26,38 @@
|
||||
enum MaliciaSpells
|
||||
{
|
||||
SPELL_CALL_OF_GRAVES = 17831,
|
||||
SPELL_CORRUPTION = 11672,
|
||||
SPELL_FLASH_HEAL = 10917,
|
||||
SPELL_RENEW = 10929,
|
||||
SPELL_HEALING_TOUCH = 9889
|
||||
SPELL_CORRUPTION = 18376,
|
||||
SPELL_SLOW = 13747,
|
||||
SPELL_FLASH_HEAL = 17843,
|
||||
SPELL_HEAL = 15586,
|
||||
SPELL_RENEW = 8362
|
||||
};
|
||||
|
||||
enum MaliciaEvents
|
||||
{
|
||||
EVENT_CALL_OF_GRAVES = 1,
|
||||
EVENT_CALL_OF_GRAVES = 1,
|
||||
EVENT_CORRUPTION,
|
||||
EVENT_SLOW,
|
||||
EVENT_FLASH_HEAL,
|
||||
EVENT_RENEW,
|
||||
EVENT_HEALING_TOUCH
|
||||
EVENT_HEAL,
|
||||
EVENT_RENEW
|
||||
};
|
||||
|
||||
// 10505 - Instructor Malicia
|
||||
struct boss_instructor_malicia : public BossAI
|
||||
{
|
||||
boss_instructor_malicia(Creature* creature) : BossAI(creature, DATA_INSTRUCTOR_MALICIA)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
FlashCounter = 0;
|
||||
TouchCounter = 0;
|
||||
}
|
||||
|
||||
uint32 FlashCounter;
|
||||
uint32 TouchCounter;
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_Reset();
|
||||
Initialize();
|
||||
}
|
||||
boss_instructor_malicia(Creature* creature) : BossAI(creature, DATA_INSTRUCTOR_MALICIA) { }
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
events.ScheduleEvent(EVENT_CALL_OF_GRAVES, 4s);
|
||||
events.ScheduleEvent(EVENT_CORRUPTION, 8s);
|
||||
events.ScheduleEvent(EVENT_RENEW, 32s);
|
||||
events.ScheduleEvent(EVENT_FLASH_HEAL, 38s);
|
||||
events.ScheduleEvent(EVENT_HEALING_TOUCH, 45s);
|
||||
|
||||
events.ScheduleEvent(EVENT_CALL_OF_GRAVES, 20s, 30s);
|
||||
events.ScheduleEvent(EVENT_CORRUPTION, 10s, 15s);
|
||||
events.ScheduleEvent(EVENT_SLOW, 5s, 10s);
|
||||
events.ScheduleEvent(EVENT_FLASH_HEAL, 5s, 10s);
|
||||
events.ScheduleEvent(EVENT_HEAL, 5s, 15s);
|
||||
events.ScheduleEvent(EVENT_RENEW, 15s, 20s);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -86,43 +76,27 @@ struct boss_instructor_malicia : public BossAI
|
||||
{
|
||||
case EVENT_CALL_OF_GRAVES:
|
||||
DoCastSelf(SPELL_CALL_OF_GRAVES);
|
||||
events.Repeat(65s);
|
||||
events.Repeat(30s, 40s);
|
||||
break;
|
||||
case EVENT_CORRUPTION:
|
||||
DoCast(SelectTarget(SelectTargetMethod::Random, 0, 100, true), SPELL_CORRUPTION);
|
||||
events.Repeat(24s);
|
||||
DoCastSelf(SPELL_CORRUPTION);
|
||||
events.Repeat(30s, 40s);
|
||||
break;
|
||||
case EVENT_SLOW:
|
||||
DoCastSelf(SPELL_SLOW);
|
||||
events.Repeat(15s, 25s);
|
||||
break;
|
||||
case EVENT_FLASH_HEAL:
|
||||
DoCastSelf(SPELL_FLASH_HEAL);
|
||||
events.Repeat(10s, 15s);
|
||||
break;
|
||||
case EVENT_HEAL:
|
||||
DoCastSelf(SPELL_HEAL);
|
||||
events.Repeat(20s, 30s);
|
||||
break;
|
||||
case EVENT_RENEW:
|
||||
DoCastSelf(SPELL_RENEW);
|
||||
events.Repeat(10s);
|
||||
break;
|
||||
case EVENT_FLASH_HEAL:
|
||||
// 5 Flash Heal will be cast
|
||||
DoCastSelf(SPELL_FLASH_HEAL);
|
||||
if (FlashCounter < 2)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_FLASH_HEAL, 5s);
|
||||
++FlashCounter;
|
||||
}
|
||||
else
|
||||
{
|
||||
FlashCounter=0;
|
||||
events.ScheduleEvent(EVENT_FLASH_HEAL, 30s);
|
||||
}
|
||||
break;
|
||||
case EVENT_HEALING_TOUCH:
|
||||
// 3 Healing Touch will be cast
|
||||
DoCastSelf(SPELL_HEALING_TOUCH);
|
||||
if (TouchCounter < 2)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_HEALING_TOUCH, 5500ms);
|
||||
++TouchCounter;
|
||||
}
|
||||
else
|
||||
{
|
||||
TouchCounter=0;
|
||||
events.ScheduleEvent(EVENT_HEALING_TOUCH, 30s);
|
||||
}
|
||||
events.Repeat(15s, 20s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
@@ -15,55 +15,57 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Timers requires to be revisited
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "scholomance.h"
|
||||
#include "ScriptedCreature.h"
|
||||
|
||||
enum JandiceTexts
|
||||
{
|
||||
EMOTE_DROP_JOURNAL = 0
|
||||
};
|
||||
|
||||
enum JandiceSpells
|
||||
{
|
||||
SPELL_CURSE_OF_BLOOD = 24673,
|
||||
SPELL_ILLUSION = 17773,
|
||||
SPELL_CURSE_OF_BLOOD = 16098,
|
||||
SPELL_BANISH = 8994,
|
||||
SPELL_SUMMON_ILLUSION = 17773,
|
||||
SPELL_SPREAD = 17774,
|
||||
|
||||
SPELL_DROP_JOURNAL = 26096
|
||||
};
|
||||
|
||||
enum JandiceEvents
|
||||
{
|
||||
EVENT_CURSE_OF_BLOOD = 1,
|
||||
EVENT_ILLUSION,
|
||||
EVENT_CLEAVE,
|
||||
EVENT_SET_VISIBILITY
|
||||
EVENT_CURSE_OF_BLOOD = 1,
|
||||
EVENT_BANISH,
|
||||
EVENT_SUMMON_ILLUSION
|
||||
};
|
||||
|
||||
// 10503 - Jandice Barov
|
||||
struct boss_jandice_barov : public ScriptedAI
|
||||
{
|
||||
boss_jandice_barov(Creature* creature) : ScriptedAI(creature), _summons(me) { }
|
||||
boss_jandice_barov(Creature* creature) : ScriptedAI(creature) { }
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_events.Reset();
|
||||
_summons.DespawnAll();
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summoned) override
|
||||
{
|
||||
// Illusions should attack a random target.
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
summoned->AI()->AttackStart(target);
|
||||
|
||||
_summons.Summon(summoned);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
{
|
||||
_events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, 15s);
|
||||
_events.ScheduleEvent(EVENT_ILLUSION, 30s);
|
||||
_events.ScheduleEvent(EVENT_CURSE_OF_BLOOD, 5s, 10s);
|
||||
_events.ScheduleEvent(EVENT_BANISH, 10s, 15s);
|
||||
_events.ScheduleEvent(EVENT_SUMMON_ILLUSION, 15s, 25s);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
_summons.DespawnAll();
|
||||
DoCastSelf(SPELL_DROP_JOURNAL, true);
|
||||
DoCastSelf(SPELL_DROP_JOURNAL);
|
||||
Talk(EMOTE_DROP_JOURNAL);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -81,20 +83,18 @@ struct boss_jandice_barov : public ScriptedAI
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_CURSE_OF_BLOOD:
|
||||
DoCastVictim(SPELL_CURSE_OF_BLOOD);
|
||||
_events.Repeat(30s);
|
||||
DoCastSelf(SPELL_CURSE_OF_BLOOD);
|
||||
_events.Repeat(25s, 30s);
|
||||
break;
|
||||
case EVENT_ILLUSION:
|
||||
DoCast(SPELL_ILLUSION);
|
||||
me->SetUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
|
||||
me->SetDisplayId(11686); // Invisible Model
|
||||
ModifyThreatByPercent(me->GetVictim(), -99);
|
||||
_events.ScheduleEvent(EVENT_SET_VISIBILITY, 3s);
|
||||
_events.Repeat(25s);
|
||||
case EVENT_BANISH:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
DoCast(target, SPELL_BANISH);
|
||||
_events.Repeat(15s, 25s);
|
||||
break;
|
||||
case EVENT_SET_VISIBILITY:
|
||||
me->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
|
||||
me->SetDisplayId(11073); // Jandice Model
|
||||
case EVENT_SUMMON_ILLUSION:
|
||||
DoCastSelf(SPELL_SUMMON_ILLUSION);
|
||||
DoCastSelf(SPELL_SPREAD);
|
||||
_events.Repeat(30s, 40s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -109,7 +109,6 @@ struct boss_jandice_barov : public ScriptedAI
|
||||
|
||||
private:
|
||||
EventMap _events;
|
||||
SummonList _summons;
|
||||
};
|
||||
|
||||
void AddSC_boss_jandicebarov()
|
||||
|
||||
@@ -15,6 +15,10 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Timers requires to be revisited
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "GameObject.h"
|
||||
#include "GameObjectAI.h"
|
||||
@@ -28,7 +32,7 @@
|
||||
|
||||
enum KirtonosTexts
|
||||
{
|
||||
EMOTE_SUMMONED = 0
|
||||
EMOTE_SUMMONED = 0
|
||||
};
|
||||
|
||||
enum KirtonosSpells
|
||||
@@ -37,160 +41,146 @@ enum KirtonosSpells
|
||||
SPELL_WING_FLAP = 12882,
|
||||
SPELL_PIERCE_ARMOR = 6016,
|
||||
SPELL_DISARM = 8379,
|
||||
SPELL_KIRTONOS_TRANSFORM = 16467,
|
||||
SPELL_SHADOW_BOLT = 17228,
|
||||
SPELL_SHADOW_BOLT_VOLLEY = 17228,
|
||||
SPELL_CURSE_OF_TONGUES = 12889,
|
||||
SPELL_DOMINATE_MIND = 14515
|
||||
SPELL_DOMINATE_MIND = 14515,
|
||||
SPELL_KIRTONOS_TRANSFORM = 16467
|
||||
};
|
||||
|
||||
enum KirtonosEvents
|
||||
{
|
||||
INTRO_1 = 1,
|
||||
INTRO_2 = 2,
|
||||
INTRO_3 = 3,
|
||||
INTRO_4 = 4,
|
||||
INTRO_5 = 5,
|
||||
INTRO_6 = 6,
|
||||
EVENT_SWOOP = 7,
|
||||
EVENT_WING_FLAP = 8,
|
||||
EVENT_PIERCE_ARMOR = 9,
|
||||
EVENT_DISARM = 10,
|
||||
EVENT_SHADOW_BOLT = 11,
|
||||
EVENT_CURSE_OF_TONGUES = 12,
|
||||
EVENT_DOMINATE_MIND = 13,
|
||||
EVENT_KIRTONOS_TRANSFORM = 14
|
||||
EVENT_SWOOP = 1,
|
||||
EVENT_WING_FLAP,
|
||||
EVENT_PIERCE_ARMOR,
|
||||
EVENT_DISARM,
|
||||
EVENT_SHADOW_BOLT_VOLLEY,
|
||||
EVENT_CURSE_OF_TONGUES,
|
||||
EVENT_DOMINATE_MIND,
|
||||
EVENT_KIRTONOS_TRANSFORM,
|
||||
|
||||
EVENT_INTRO_1,
|
||||
EVENT_INTRO_2,
|
||||
EVENT_INTRO_3,
|
||||
EVENT_INTRO_4,
|
||||
EVENT_INTRO_5
|
||||
};
|
||||
|
||||
enum KirtonosMisc
|
||||
{
|
||||
WEAPON_KIRTONOS_STAFF = 11365,
|
||||
POINT_KIRTONOS_LAND = 13,
|
||||
KIRTONOS_PATH = 105061
|
||||
EQUIP_ID_STAFF = 11365,
|
||||
POINT_LANDING = 13,
|
||||
POINT_STAIRS_UP = 0,
|
||||
POINT_STAIRS_DOWN = 1,
|
||||
PATH_INTRO = 105061,
|
||||
NPC_KIRTONOS = 10506,
|
||||
SOUND_SCREECH = 557
|
||||
};
|
||||
|
||||
Position const PosMove[2] =
|
||||
{
|
||||
{ 299.4884f, 92.76137f, 105.6335f, 0.0f },
|
||||
{ 314.8673f, 90.30210f, 101.6459f, 0.0f }
|
||||
};
|
||||
Position const SpawnPosition = { 315.0280f, 70.53845f, 102.1496f, 0.3859715f };
|
||||
Position const MovePosition1 = { 299.4884f, 92.76137f, 105.6335f, 0.0f };
|
||||
Position const MovePosition2 = { 314.8673f, 90.30210f, 101.6459f, 0.0f };
|
||||
|
||||
// 10506 - Kirtonos the Herald
|
||||
struct boss_kirtonos_the_herald : public BossAI
|
||||
{
|
||||
boss_kirtonos_the_herald(Creature* creature) : BossAI(creature, DATA_KIRTONOS) { }
|
||||
|
||||
void Reset() override
|
||||
void JustAppeared() override
|
||||
{
|
||||
_Reset();
|
||||
events.ScheduleEvent(EVENT_INTRO_1, 0s);
|
||||
me->SetDisableGravity(true);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
events.ScheduleEvent(EVENT_SWOOP, 8s, 8s);
|
||||
events.ScheduleEvent(EVENT_WING_FLAP, 15s, 15s);
|
||||
events.ScheduleEvent(EVENT_PIERCE_ARMOR, 18s, 18s);
|
||||
events.ScheduleEvent(EVENT_DISARM, 22s, 22s);
|
||||
events.ScheduleEvent(EVENT_SHADOW_BOLT, 42s, 42s);
|
||||
events.ScheduleEvent(EVENT_CURSE_OF_TONGUES, 53s, 53s);
|
||||
events.ScheduleEvent(EVENT_DOMINATE_MIND, 34s, 48s);
|
||||
events.ScheduleEvent(EVENT_KIRTONOS_TRANSFORM, 20s, 20s);
|
||||
BossAI::JustEngagedWith(who);
|
||||
|
||||
// Abilities he uses doesn't depend on form
|
||||
events.ScheduleEvent(EVENT_SWOOP, 15s, 20s);
|
||||
events.ScheduleEvent(EVENT_WING_FLAP, 10s, 20s);
|
||||
events.ScheduleEvent(EVENT_PIERCE_ARMOR, 10s, 30s);
|
||||
events.ScheduleEvent(EVENT_DISARM, 10s, 25s);
|
||||
events.ScheduleEvent(EVENT_SHADOW_BOLT_VOLLEY, 40s, 50s);
|
||||
events.ScheduleEvent(EVENT_CURSE_OF_TONGUES, 50s, 60s);
|
||||
events.ScheduleEvent(EVENT_DOMINATE_MIND, 60s);
|
||||
events.ScheduleEvent(EVENT_KIRTONOS_TRANSFORM, 18s);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
void MovementInform(uint32 type, uint32 pointId) override
|
||||
{
|
||||
if (GameObject* gate = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_GATE_KIRTONOS)))
|
||||
gate->SetGoState(GO_STATE_ACTIVE);
|
||||
if (GameObject* brazier = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_BRAZIER_OF_THE_HERALD)))
|
||||
{
|
||||
brazier->ResetDoorOrButton();
|
||||
brazier->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
_JustDied();
|
||||
if (type == WAYPOINT_MOTION_TYPE && pointId == POINT_LANDING)
|
||||
events.ScheduleEvent(EVENT_INTRO_2, 0s);
|
||||
|
||||
if (type == POINT_MOTION_TYPE && pointId == POINT_STAIRS_UP)
|
||||
events.ScheduleEvent(EVENT_INTRO_3, 2s);
|
||||
}
|
||||
|
||||
void EnterEvadeMode(EvadeReason /*why*/) override
|
||||
{
|
||||
if (GameObject* gate = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_GATE_KIRTONOS)))
|
||||
gate->SetGoState(GO_STATE_ACTIVE);
|
||||
if (GameObject* brazier = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_BRAZIER_OF_THE_HERALD)))
|
||||
|
||||
me->DespawnOrUnsummon();
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
if (GameObject* gate = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_GATE_KIRTONOS)))
|
||||
gate->SetGoState(GO_STATE_ACTIVE);
|
||||
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void UpdateIntroEvents(uint32 diff)
|
||||
{
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
brazier->ResetDoorOrButton();
|
||||
brazier->SetGoState(GO_STATE_READY);
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_INTRO_1:
|
||||
Talk(EMOTE_SUMMONED);
|
||||
me->GetMotionMaster()->MovePath(PATH_INTRO, false);
|
||||
break;
|
||||
case EVENT_INTRO_2:
|
||||
me->GetMotionMaster()->MovePoint(POINT_STAIRS_UP, MovePosition1, true, 0.01745329f);
|
||||
if (GameObject* gate = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_GATE_KIRTONOS)))
|
||||
gate->SetGoState(GO_STATE_READY);
|
||||
break;
|
||||
case EVENT_INTRO_3:
|
||||
me->SetDisableGravity(false);
|
||||
DoCastSelf(SPELL_KIRTONOS_TRANSFORM);
|
||||
events.ScheduleEvent(EVENT_INTRO_4, 1s);
|
||||
break;
|
||||
case EVENT_INTRO_4:
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_ROAR);
|
||||
SetEquipmentSlots(false, EQUIP_ID_STAFF);
|
||||
me->SetImmuneToAll(false);
|
||||
if (GameObject* brazier = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_BRAZIER_OF_THE_HERALD)))
|
||||
brazier->SetGoState(GO_STATE_READY);
|
||||
events.ScheduleEvent(EVENT_INTRO_5, 5s);
|
||||
break;
|
||||
case EVENT_INTRO_5:
|
||||
me->SetWalk(true);
|
||||
me->GetMotionMaster()->MovePoint(POINT_STAIRS_DOWN, MovePosition2);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
me->DespawnOrUnsummon(5s);
|
||||
}
|
||||
|
||||
void IsSummonedBy(WorldObject* /*summoner*/) override
|
||||
{
|
||||
events.ScheduleEvent(INTRO_1, 500ms);
|
||||
me->SetDisableGravity(true);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_UNINTERACTIBLE);
|
||||
Talk(EMOTE_SUMMONED);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon) override
|
||||
{
|
||||
BossAI::JustSummoned(summon);
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id) override
|
||||
{
|
||||
if (type == WAYPOINT_MOTION_TYPE && id == POINT_KIRTONOS_LAND)
|
||||
events.ScheduleEvent(INTRO_2, 1500ms);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
events.Update(diff);
|
||||
|
||||
if (!UpdateVictim())
|
||||
{
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case INTRO_1:
|
||||
me->GetMotionMaster()->MovePath(KIRTONOS_PATH, false);
|
||||
break;
|
||||
case INTRO_2:
|
||||
me->GetMotionMaster()->MovePoint(0, PosMove[0]);
|
||||
events.ScheduleEvent(INTRO_3, 1s);
|
||||
break;
|
||||
case INTRO_3:
|
||||
if (GameObject* gate = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_GATE_KIRTONOS)))
|
||||
gate->SetGoState(GO_STATE_READY);
|
||||
me->SetFacingTo(0.01745329f);
|
||||
events.ScheduleEvent(INTRO_4, 3s);
|
||||
break;
|
||||
case INTRO_4:
|
||||
if (GameObject* brazier = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_BRAZIER_OF_THE_HERALD)))
|
||||
brazier->SetGoState(GO_STATE_READY);
|
||||
me->SetWalk(true);
|
||||
me->SetDisableGravity(false);
|
||||
DoCast(me, SPELL_KIRTONOS_TRANSFORM);
|
||||
me->SetCanFly(false);
|
||||
events.ScheduleEvent(INTRO_5, 1s);
|
||||
break;
|
||||
case INTRO_5:
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_ROAR);
|
||||
me->SetVirtualItem(0, uint32(WEAPON_KIRTONOS_STAFF));
|
||||
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_UNINTERACTIBLE);
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
events.ScheduleEvent(INTRO_6, 5s);
|
||||
break;
|
||||
case INTRO_6:
|
||||
me->GetMotionMaster()->MovePoint(0, PosMove[1]);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
UpdateIntroEvents(diff);
|
||||
return;
|
||||
}
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
@@ -199,47 +189,48 @@ struct boss_kirtonos_the_herald : public BossAI
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_SWOOP:
|
||||
DoCastVictim(SPELL_SWOOP);
|
||||
events.Repeat(15s);
|
||||
DoCastSelf(SPELL_SWOOP);
|
||||
events.Repeat(10s, 15s);
|
||||
break;
|
||||
case EVENT_WING_FLAP:
|
||||
DoCastSelf(SPELL_WING_FLAP);
|
||||
events.Repeat(13s);
|
||||
events.Repeat(15s);
|
||||
break;
|
||||
case EVENT_PIERCE_ARMOR:
|
||||
DoCastVictim(SPELL_PIERCE_ARMOR);
|
||||
events.Repeat(12s);
|
||||
events.Repeat(45s, 60s);
|
||||
break;
|
||||
case EVENT_DISARM:
|
||||
DoCastVictim(SPELL_DISARM);
|
||||
events.Repeat(11s);
|
||||
events.Repeat(10s, 20s);
|
||||
break;
|
||||
case EVENT_SHADOW_BOLT:
|
||||
DoCastVictim(SPELL_SHADOW_BOLT);
|
||||
events.Repeat(42s);
|
||||
case EVENT_SHADOW_BOLT_VOLLEY:
|
||||
DoCastSelf(SPELL_SHADOW_BOLT_VOLLEY);
|
||||
events.Repeat(3s, 7s);
|
||||
break;
|
||||
case EVENT_CURSE_OF_TONGUES:
|
||||
DoCastVictim(SPELL_CURSE_OF_TONGUES);
|
||||
events.Repeat(35s);
|
||||
DoCastSelf(SPELL_CURSE_OF_TONGUES);
|
||||
events.Repeat(30s, 50s);
|
||||
break;
|
||||
case EVENT_DOMINATE_MIND:
|
||||
DoCastVictim(SPELL_DOMINATE_MIND);
|
||||
events.Repeat(44s, 48s);
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1))
|
||||
DoCast(target, SPELL_DOMINATE_MIND);
|
||||
events.Repeat(30s, 50s);
|
||||
break;
|
||||
case EVENT_KIRTONOS_TRANSFORM:
|
||||
if (me->HasAura(SPELL_KIRTONOS_TRANSFORM))
|
||||
{
|
||||
// This is how it works...
|
||||
DoCastSelf(SPELL_KIRTONOS_TRANSFORM);
|
||||
me->RemoveAura(SPELL_KIRTONOS_TRANSFORM);
|
||||
me->SetVirtualItem(0, uint32(0));
|
||||
me->SetCanFly(false);
|
||||
SetEquipmentSlots(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
DoCast(me, SPELL_KIRTONOS_TRANSFORM);
|
||||
me->SetVirtualItem(0, uint32(WEAPON_KIRTONOS_STAFF));
|
||||
me->SetCanFly(true);
|
||||
DoCastSelf(SPELL_KIRTONOS_TRANSFORM);
|
||||
SetEquipmentSlots(false, EQUIP_ID_STAFF);
|
||||
}
|
||||
events.Repeat(16s, 18s);
|
||||
events.Repeat(20s, 30s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -253,17 +244,7 @@ struct boss_kirtonos_the_herald : public BossAI
|
||||
}
|
||||
};
|
||||
|
||||
enum Brazier_Of_The_Herald
|
||||
{
|
||||
NPC_KIRTONOS = 10506,
|
||||
SOUND_SCREECH = 557
|
||||
};
|
||||
|
||||
Position const PosSummon[1] =
|
||||
{
|
||||
{ 315.028f, 70.53845f, 102.1496f, 0.3859715f }
|
||||
};
|
||||
|
||||
// 175564 - Brazier of the Herald
|
||||
struct go_brazier_of_the_herald : public GameObjectAI
|
||||
{
|
||||
go_brazier_of_the_herald(GameObject* go) : GameObjectAI(go) { }
|
||||
@@ -271,8 +252,8 @@ struct go_brazier_of_the_herald : public GameObjectAI
|
||||
bool OnGossipHello(Player* player) override
|
||||
{
|
||||
me->UseDoorOrButton();
|
||||
me->PlayDirectSound(SOUND_SCREECH, 0);
|
||||
player->SummonCreature(NPC_KIRTONOS, PosSummon[0], TEMPSUMMON_DEAD_DESPAWN, 15min);
|
||||
me->PlayDirectSound(SOUND_SCREECH);
|
||||
player->SummonCreature(NPC_KIRTONOS, SpawnPosition, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -15,23 +15,40 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Timers requires to be revisited
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "scholomance.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "SpellInfo.h"
|
||||
#include "SpellScript.h"
|
||||
|
||||
enum KormokTexts
|
||||
{
|
||||
SAY_SPAWN = 0,
|
||||
SAY_AGGRO = 1,
|
||||
SAY_DEATH = 2,
|
||||
EMOTE_FRENZY = 3
|
||||
};
|
||||
|
||||
enum KormokSpells
|
||||
{
|
||||
SPELL_SHADOWBOLT_VOLLEY = 20741,
|
||||
// Combat
|
||||
SPELL_SHADOW_BOLT_VOLLEY = 17228,
|
||||
SPELL_BONE_SHIELD = 27688,
|
||||
|
||||
SPELL_BLOODLUST = 27689,
|
||||
SPELL_SUMMON_BONE_MAGES = 27695,
|
||||
SPELL_SUMMON_BONE_MINIONS = 27687,
|
||||
SPELL_FRENZY = 8269,
|
||||
|
||||
// Scripts
|
||||
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,
|
||||
SPELL_SUMMON_BONE_MINION_FRONT = 27690,
|
||||
SPELL_SUMMON_BONE_MINION_BACK = 27691,
|
||||
SPELL_SUMMON_BONE_MINION_LEFT = 27692,
|
||||
@@ -40,34 +57,94 @@ enum KormokSpells
|
||||
|
||||
enum KormokEvents
|
||||
{
|
||||
EVENT_SHADOWBOLT_VOLLEY = 1,
|
||||
// Combat
|
||||
EVENT_SHADOWBOLT_VOLLEY = 1,
|
||||
EVENT_BONE_SHIELD,
|
||||
EVENT_BLOODLUST,
|
||||
EVENT_SUMMON_MAGES,
|
||||
EVENT_SUMMON_MINIONS
|
||||
EVENT_SUMMON_MINIONS,
|
||||
EVENT_FRENZY,
|
||||
|
||||
// Intro
|
||||
EVENT_INTRO_1,
|
||||
EVENT_INTRO_2,
|
||||
EVENT_INTRO_3
|
||||
};
|
||||
|
||||
// 16118 - Kormok
|
||||
struct boss_kormok : public ScriptedAI
|
||||
{
|
||||
boss_kormok(Creature* creature) : ScriptedAI(creature) { }
|
||||
boss_kormok(Creature* creature) : ScriptedAI(creature), _frenzied(false) { }
|
||||
|
||||
void JustAppeared() override
|
||||
{
|
||||
_events.ScheduleEvent(EVENT_INTRO_1, 0s);
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_events.Reset();
|
||||
_frenzied = false;
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
{
|
||||
_events.ScheduleEvent(EVENT_SHADOWBOLT_VOLLEY, 10s);
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
_events.ScheduleEvent(EVENT_SHADOWBOLT_VOLLEY, 10s, 15s);
|
||||
_events.ScheduleEvent(EVENT_BONE_SHIELD, 2s);
|
||||
_events.ScheduleEvent(EVENT_BLOODLUST, 20s, 30s);
|
||||
_events.ScheduleEvent(EVENT_SUMMON_MAGES, 10s, 15s);
|
||||
_events.ScheduleEvent(EVENT_SUMMON_MINIONS, 5s, 10s);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
|
||||
{
|
||||
if (!_frenzied && me->HealthBelowPctDamaged(20, damage))
|
||||
{
|
||||
_frenzied = true;
|
||||
_events.ScheduleEvent(EVENT_FRENZY, 0s);
|
||||
}
|
||||
}
|
||||
|
||||
void OnSpellCast(SpellInfo const* spell) override
|
||||
{
|
||||
if (spell->Id == SPELL_FRENZY)
|
||||
Talk(EMOTE_FRENZY);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
{
|
||||
_events.Update(diff);
|
||||
|
||||
while (uint32 eventId = _events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_INTRO_1:
|
||||
me->SetImmuneToPC(true);
|
||||
_events.ScheduleEvent(EVENT_INTRO_2, 2s);
|
||||
break;
|
||||
case EVENT_INTRO_2:
|
||||
Talk(SAY_SPAWN);
|
||||
_events.ScheduleEvent(EVENT_INTRO_3, 5s);
|
||||
break;
|
||||
case EVENT_INTRO_3:
|
||||
me->SetImmuneToPC(false);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
_events.Update(diff);
|
||||
|
||||
@@ -79,13 +156,17 @@ struct boss_kormok : public ScriptedAI
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_SHADOWBOLT_VOLLEY:
|
||||
DoCastSelf(SPELL_SHADOWBOLT_VOLLEY);
|
||||
_events.Repeat(15s);
|
||||
DoCastSelf(SPELL_SHADOW_BOLT_VOLLEY);
|
||||
_events.Repeat(15s, 20s);
|
||||
break;
|
||||
case EVENT_BONE_SHIELD:
|
||||
DoCastSelf(SPELL_BONE_SHIELD);
|
||||
_events.Repeat(45s);
|
||||
break;
|
||||
case EVENT_BLOODLUST:
|
||||
DoCastSelf(SPELL_BLOODLUST);
|
||||
_events.Repeat(30s, 40s);
|
||||
break;
|
||||
case EVENT_SUMMON_MAGES:
|
||||
DoCastSelf(SPELL_SUMMON_BONE_MAGES);
|
||||
_events.Repeat(10s, 15s);
|
||||
@@ -94,6 +175,9 @@ struct boss_kormok : public ScriptedAI
|
||||
DoCastSelf(SPELL_SUMMON_BONE_MINIONS);
|
||||
_events.Repeat(20s, 25s);
|
||||
break;
|
||||
case EVENT_FRENZY:
|
||||
DoCastSelf(SPELL_FRENZY);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -106,6 +190,7 @@ struct boss_kormok : public ScriptedAI
|
||||
}
|
||||
|
||||
private:
|
||||
bool _frenzied;
|
||||
EventMap _events;
|
||||
};
|
||||
|
||||
|
||||
@@ -15,21 +15,28 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "scholomance.h"
|
||||
/*
|
||||
* Timers requires to be revisited
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "scholomance.h"
|
||||
#include "ScriptedCreature.h"
|
||||
|
||||
enum AlexeiSpells
|
||||
{
|
||||
SPELL_IMMOLATE = 20294,
|
||||
SPELL_VEIL_OF_SHADOW = 17820,
|
||||
SPELL_UNHOLY_AURA = 17467
|
||||
// Passive
|
||||
SPELL_IMMOLATE = 15506,
|
||||
SPELL_UNHOLY_AURA = 17467,
|
||||
|
||||
// Combat
|
||||
SPELL_VEIL_OF_SHADOW = 17820
|
||||
|
||||
};
|
||||
|
||||
enum AlexeiEvents
|
||||
{
|
||||
EVENT_IMMOLATE = 1,
|
||||
EVENT_VEIL_OF_SHADOW
|
||||
EVENT_VEIL_OF_SHADOW = 1
|
||||
};
|
||||
|
||||
// 10504 - Lord Alexei Barov
|
||||
@@ -41,15 +48,15 @@ struct boss_lord_alexei_barov : public BossAI
|
||||
{
|
||||
_Reset();
|
||||
|
||||
if (!me->HasAura(SPELL_UNHOLY_AURA))
|
||||
DoCastSelf(SPELL_UNHOLY_AURA);
|
||||
DoCastSelf(SPELL_IMMOLATE);
|
||||
DoCastSelf(SPELL_UNHOLY_AURA);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
events.ScheduleEvent(EVENT_IMMOLATE, 7s);
|
||||
events.ScheduleEvent(EVENT_VEIL_OF_SHADOW, 15s);
|
||||
|
||||
events.ScheduleEvent(EVENT_VEIL_OF_SHADOW, 10s, 15s);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -66,13 +73,9 @@ struct boss_lord_alexei_barov : public BossAI
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_IMMOLATE:
|
||||
DoCast(SelectTarget(SelectTargetMethod::Random, 0, 100, true), SPELL_IMMOLATE);
|
||||
events.Repeat(12s);
|
||||
break;
|
||||
case EVENT_VEIL_OF_SHADOW:
|
||||
DoCastVictim(SPELL_VEIL_OF_SHADOW);
|
||||
events.Repeat(20s);
|
||||
events.Repeat(15s, 25s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
@@ -15,24 +15,26 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "scholomance.h"
|
||||
/*
|
||||
* Timers requires to be revisited
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "scholomance.h"
|
||||
#include "ScriptedCreature.h"
|
||||
|
||||
enum PolkeltSpells
|
||||
{
|
||||
SPELL_VOLATILE_INFECTION = 24928,
|
||||
SPELL_DARK_PLAGUE = 18270,
|
||||
SPELL_CORROSIVE_ACID = 23313,
|
||||
SPELL_NOXIOUS_CATALYST = 18151
|
||||
SPELL_VOLATILE_INFECTION = 18149,
|
||||
SPELL_NOXIOUS_CATALYST = 18151,
|
||||
SPELL_CORROSIVE_ACID = 8245
|
||||
};
|
||||
|
||||
enum PolkeltEvents
|
||||
{
|
||||
EVENT_VOLATILE_INFECTION = 1,
|
||||
EVENT_DARK_PLAGUE,
|
||||
EVENT_CORROSIVE_ACID,
|
||||
EVENT_NOXIOUS_CATALYST
|
||||
EVENT_VOLATILE_INFECTION = 1,
|
||||
EVENT_NOXIOUS_CATALYST,
|
||||
EVENT_CORROSIVE_ACID
|
||||
};
|
||||
|
||||
// 10901 - Lorekeeper Polkelt
|
||||
@@ -43,10 +45,10 @@ struct boss_lorekeeper_polkelt : public BossAI
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
events.ScheduleEvent(EVENT_VOLATILE_INFECTION, 38s);
|
||||
events.ScheduleEvent(EVENT_DARK_PLAGUE, 8s);
|
||||
events.ScheduleEvent(EVENT_CORROSIVE_ACID, 45s);
|
||||
events.ScheduleEvent(EVENT_NOXIOUS_CATALYST, 35s);
|
||||
|
||||
events.ScheduleEvent(EVENT_VOLATILE_INFECTION, 15s, 20s);
|
||||
events.ScheduleEvent(EVENT_NOXIOUS_CATALYST, 10s, 20s);
|
||||
events.ScheduleEvent(EVENT_CORROSIVE_ACID, 20s, 30s);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -65,19 +67,15 @@ struct boss_lorekeeper_polkelt : public BossAI
|
||||
{
|
||||
case EVENT_VOLATILE_INFECTION:
|
||||
DoCastVictim(SPELL_VOLATILE_INFECTION);
|
||||
events.Repeat(32s);
|
||||
break;
|
||||
case EVENT_DARK_PLAGUE:
|
||||
DoCastVictim(SPELL_DARK_PLAGUE);
|
||||
events.Repeat(8s);
|
||||
break;
|
||||
case EVENT_CORROSIVE_ACID:
|
||||
DoCastSelf(SPELL_CORROSIVE_ACID);
|
||||
events.Repeat(25s);
|
||||
events.Repeat(10s, 20s);
|
||||
break;
|
||||
case EVENT_NOXIOUS_CATALYST:
|
||||
DoCastVictim(SPELL_NOXIOUS_CATALYST);
|
||||
events.Repeat(38s);
|
||||
events.Repeat(20s, 30s);
|
||||
break;
|
||||
case EVENT_CORROSIVE_ACID:
|
||||
DoCastSelf(SPELL_CORROSIVE_ACID);
|
||||
events.Repeat(30s, 40s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
@@ -15,28 +15,32 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "scholomance.h"
|
||||
/*
|
||||
* Timers requires to be revisited
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "scholomance.h"
|
||||
#include "ScriptedCreature.h"
|
||||
|
||||
enum RasSpells
|
||||
{
|
||||
SPELL_FROSTBOLT = 21369,
|
||||
SPELL_ICE_ARMOR = 18100, // This is actually a buff he gives himself
|
||||
SPELL_ICE_ARMOR = 18100,
|
||||
SPELL_FREEZE = 18763,
|
||||
SPELL_FEAR = 26070,
|
||||
SPELL_FEAR = 12096,
|
||||
SPELL_CHILL_NOVA = 18099,
|
||||
SPELL_KNOCK_AWAY = 11130,
|
||||
SPELL_FROSTBOLT_VOLLEY = 8398
|
||||
};
|
||||
|
||||
enum RasEvents
|
||||
{
|
||||
EVENT_FROSTBOLT = 1,
|
||||
EVENT_ICE_ARMOR,
|
||||
EVENT_ICE_ARMOR = 1,
|
||||
EVENT_FREEZE,
|
||||
EVENT_FEAR,
|
||||
EVENT_CHILL_NOVA,
|
||||
EVENT_FROSTVOLLEY
|
||||
EVENT_KNOCK_AWAY,
|
||||
EVENT_FROSTBOLT_VOLLEY
|
||||
};
|
||||
|
||||
// 10508 - Ras Frostwhisper
|
||||
@@ -47,16 +51,18 @@ struct boss_boss_ras_frostwhisper : public ScriptedAI
|
||||
void Reset() override
|
||||
{
|
||||
_events.Reset();
|
||||
|
||||
DoCastSelf(SPELL_ICE_ARMOR);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
{
|
||||
_events.ScheduleEvent(EVENT_ICE_ARMOR, 2s);
|
||||
_events.ScheduleEvent(EVENT_FROSTBOLT, 8s);
|
||||
_events.ScheduleEvent(EVENT_CHILL_NOVA, 12s);
|
||||
_events.ScheduleEvent(EVENT_FREEZE, 18s);
|
||||
_events.ScheduleEvent(EVENT_FEAR, 45s);
|
||||
_events.ScheduleEvent(EVENT_ICE_ARMOR, 30s);
|
||||
_events.ScheduleEvent(EVENT_FREEZE, 20s, 30s);
|
||||
_events.ScheduleEvent(EVENT_FEAR, 10s, 20s);
|
||||
_events.ScheduleEvent(EVENT_CHILL_NOVA, 10s, 15s);
|
||||
_events.ScheduleEvent(EVENT_KNOCK_AWAY, 20s, 30s);
|
||||
_events.ScheduleEvent(EVENT_FROSTBOLT_VOLLEY, 10s, 20s);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -74,29 +80,30 @@ struct boss_boss_ras_frostwhisper : public ScriptedAI
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_ICE_ARMOR:
|
||||
DoCastSelf(SPELL_ICE_ARMOR);
|
||||
_events.Repeat(3min);
|
||||
break;
|
||||
case EVENT_FROSTBOLT:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true))
|
||||
DoCast(target, SPELL_FROSTBOLT);
|
||||
_events.Repeat(8s);
|
||||
if (!me->HasAura(SPELL_ICE_ARMOR))
|
||||
DoCastSelf(SPELL_ICE_ARMOR);
|
||||
_events.Repeat(30s);
|
||||
break;
|
||||
case EVENT_FREEZE:
|
||||
DoCastVictim(SPELL_FREEZE);
|
||||
_events.Repeat(24s);
|
||||
_events.Repeat(30s, 40s);
|
||||
break;
|
||||
case EVENT_FEAR:
|
||||
DoCastSelf(SPELL_FEAR);
|
||||
_events.Repeat(30s);
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
DoCast(target, SPELL_FEAR);
|
||||
_events.Repeat(20s, 30s);
|
||||
break;
|
||||
case EVENT_CHILL_NOVA:
|
||||
DoCastSelf(SPELL_CHILL_NOVA);
|
||||
_events.Repeat(14s);
|
||||
_events.Repeat(15s, 25s);
|
||||
break;
|
||||
case EVENT_FROSTVOLLEY:
|
||||
DoCastVictim(SPELL_FROSTBOLT_VOLLEY);
|
||||
_events.Repeat(15s);
|
||||
case EVENT_KNOCK_AWAY:
|
||||
DoCastSelf(SPELL_KNOCK_AWAY);
|
||||
_events.Repeat(20s, 30s);
|
||||
break;
|
||||
case EVENT_FROSTBOLT_VOLLEY:
|
||||
DoCastSelf(SPELL_FROSTBOLT_VOLLEY);
|
||||
_events.Repeat(10s, 20s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
@@ -15,21 +15,25 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "scholomance.h"
|
||||
/*
|
||||
* Timers requires to be revisited
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "scholomance.h"
|
||||
#include "ScriptedCreature.h"
|
||||
|
||||
enum RavenianSpells
|
||||
{
|
||||
SPELL_TRAMPLE = 15550,
|
||||
SPELL_CLEAVE = 20691,
|
||||
SPELL_SUNDERING_CLEAVE = 25174,
|
||||
SPELL_KNOCK_AWAY = 10101
|
||||
SPELL_CLEAVE = 40504,
|
||||
SPELL_SUNDERING_CLEAVE = 17963,
|
||||
SPELL_KNOCK_AWAY = 18670
|
||||
};
|
||||
|
||||
enum RavenianEvents
|
||||
{
|
||||
EVENT_TRAMPLE = 1,
|
||||
EVENT_TRAMPLE = 1,
|
||||
EVENT_CLEAVE,
|
||||
EVENT_SUNDERING_CLEAVE,
|
||||
EVENT_KNOCK_AWAY
|
||||
@@ -43,10 +47,11 @@ struct boss_the_ravenian : public BossAI
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
events.ScheduleEvent(EVENT_TRAMPLE, 24s);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 15s);
|
||||
events.ScheduleEvent(EVENT_SUNDERING_CLEAVE, 40s);
|
||||
events.ScheduleEvent(EVENT_KNOCK_AWAY, 32s);
|
||||
|
||||
events.ScheduleEvent(EVENT_TRAMPLE, 8s, 15s);
|
||||
events.ScheduleEvent(EVENT_CLEAVE, 10s, 15s);
|
||||
events.ScheduleEvent(EVENT_SUNDERING_CLEAVE, 20s, 30s);
|
||||
events.ScheduleEvent(EVENT_KNOCK_AWAY, 5s, 10s);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -65,19 +70,19 @@ struct boss_the_ravenian : public BossAI
|
||||
{
|
||||
case EVENT_TRAMPLE:
|
||||
DoCastSelf(SPELL_TRAMPLE);
|
||||
events.Repeat(10s);
|
||||
events.Repeat(8s, 15s);
|
||||
break;
|
||||
case EVENT_CLEAVE:
|
||||
DoCastVictim(SPELL_CLEAVE);
|
||||
events.Repeat(7s);
|
||||
events.Repeat(10s, 15s);
|
||||
break;
|
||||
case EVENT_SUNDERING_CLEAVE:
|
||||
DoCastVictim(SPELL_SUNDERING_CLEAVE);
|
||||
events.Repeat(20s);
|
||||
events.Repeat(20s, 30s);
|
||||
break;
|
||||
case EVENT_KNOCK_AWAY:
|
||||
DoCastVictim(SPELL_KNOCK_AWAY);
|
||||
events.Repeat(12s);
|
||||
events.Repeat(8s, 15s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
@@ -15,28 +15,28 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "scholomance.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
/*
|
||||
* Timers requires to be revisited
|
||||
*/
|
||||
|
||||
enum VectusTexts
|
||||
{
|
||||
EMOTE_FRENZY = 0
|
||||
};
|
||||
#include "ScriptMgr.h"
|
||||
#include "scholomance.h"
|
||||
#include "ScriptedCreature.h"
|
||||
|
||||
enum VectusSpells
|
||||
{
|
||||
SPELL_FLAMESTRIKE = 18399,
|
||||
// Passive
|
||||
SPELL_FIRE_SHIELD = 13377,
|
||||
|
||||
// Combat
|
||||
SPELL_BLAST_WAVE = 16046,
|
||||
SPELL_FIRE_SHIELD = 19626,
|
||||
SPELL_FRENZY = 8269 // 28371
|
||||
SPELL_FLAMESTRIKE = 18399
|
||||
};
|
||||
|
||||
enum VectusEvents
|
||||
{
|
||||
EVENT_FIRE_SHIELD = 1,
|
||||
EVENT_BLAST_WAVE,
|
||||
EVENT_FRENZY
|
||||
EVENT_BLAST_WAVE = 1,
|
||||
EVENT_FLAMESTRIKE
|
||||
};
|
||||
|
||||
// 10432 - Vectus
|
||||
@@ -47,18 +47,14 @@ struct boss_vectus : public ScriptedAI
|
||||
void Reset() override
|
||||
{
|
||||
_events.Reset();
|
||||
|
||||
DoCastSelf(SPELL_FIRE_SHIELD);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* /*who*/) override
|
||||
{
|
||||
_events.ScheduleEvent(EVENT_FIRE_SHIELD, 2s);
|
||||
_events.ScheduleEvent(EVENT_BLAST_WAVE, 14s);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
|
||||
{
|
||||
if (!me->HasAura(SPELL_FRENZY) && me->HealthBelowPctDamaged(25, damage))
|
||||
_events.ScheduleEvent(EVENT_FRENZY, 0s);
|
||||
_events.ScheduleEvent(EVENT_BLAST_WAVE, 15s, 25s);
|
||||
_events.ScheduleEvent(EVENT_FLAMESTRIKE, 10s, 15s);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
@@ -75,18 +71,14 @@ struct boss_vectus : public ScriptedAI
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_FIRE_SHIELD:
|
||||
DoCastSelf(SPELL_FIRE_SHIELD);
|
||||
_events.Repeat(90s);
|
||||
break;
|
||||
case EVENT_BLAST_WAVE:
|
||||
DoCastSelf(SPELL_BLAST_WAVE);
|
||||
_events.Repeat(12s);
|
||||
_events.Repeat(20s, 30s);
|
||||
break;
|
||||
case EVENT_FRENZY:
|
||||
DoCastSelf(SPELL_FRENZY);
|
||||
Talk(EMOTE_FRENZY);
|
||||
_events.Repeat(24s);
|
||||
case EVENT_FLAMESTRIKE:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
DoCast(target, SPELL_FLAMESTRIKE);
|
||||
_events.Repeat(10s, 15s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user