diff options
| author | offl <11556157+offl@users.noreply.github.com> | 2025-11-08 22:05:10 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-11-08 21:05:10 +0100 |
| commit | 5a2cfd095c31b7785bf8a61e1b071873ffa25937 (patch) | |
| tree | 286164e7eea22c3cd76bbd06552f2e8b5ce7ae47 | |
| parent | 806a44526d3787ec5c9bb9931f46947d29c0cd6f (diff) | |
Scripts/Scholomance: Update scripts (#31333)
13 files changed, 568 insertions, 377 deletions
diff --git a/sql/updates/world/3.3.5/2025_11_08_01_world.sql b/sql/updates/world/3.3.5/2025_11_08_01_world.sql new file mode 100644 index 00000000000..ed43515296f --- /dev/null +++ b/sql/updates/world/3.3.5/2025_11_08_01_world.sql @@ -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; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_death_knight_darkreaver.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_death_knight_darkreaver.cpp index af62380ba0e..5546d56f84e 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_death_knight_darkreaver.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_death_knight_darkreaver.cpp @@ -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 JustAppeared() override + { + Talk(SAY_SPAWN); + } + void Reset() override { + _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(SUMMON_FALLEN_CHARGER, true); + DoCastSelf(SPELL_SUMMON_FALLEN_CHARGER, true); } - void JustEngagedWith(Unit* /*who*/) override + 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() diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp index 74879b5dbd4..cc92c49594b 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp @@ -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() diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_illucia_barov.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_illucia_barov.cpp index b9b40ee9aae..4c609c239a5 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_illucia_barov.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_illucia_barov.cpp @@ -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; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp index df70433bfeb..547883b4ddf 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp @@ -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_RENEW: - DoCastSelf(SPELL_RENEW); - events.Repeat(10s); + case EVENT_SLOW: + DoCastSelf(SPELL_SLOW); + events.Repeat(15s, 25s); 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); - } + events.Repeat(10s, 15s); + break; + case EVENT_HEAL: + DoCastSelf(SPELL_HEAL); + events.Repeat(20s, 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); - } + case EVENT_RENEW: + DoCastSelf(SPELL_RENEW); + events.Repeat(15s, 20s); break; default: break; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp index 32f7e0cd2cb..982c2e118a1 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_jandice_barov.cpp @@ -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() diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp index 7e2640da7c3..14ee3c36f3d 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp @@ -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))) - { - brazier->ResetDoorOrButton(); - brazier->SetGoState(GO_STATE_READY); - } - 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); + me->DespawnOrUnsummon(); } - void JustSummoned(Creature* summon) override + void JustDied(Unit* /*killer*/) override { - BossAI::JustSummoned(summon); - } + if (GameObject* gate = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(GO_GATE_KIRTONOS))) + gate->SetGoState(GO_STATE_ACTIVE); - void MovementInform(uint32 type, uint32 id) override - { - if (type == WAYPOINT_MOTION_TYPE && id == POINT_KIRTONOS_LAND) - events.ScheduleEvent(INTRO_2, 1500ms); + _JustDied(); } - void UpdateAI(uint32 diff) override + void UpdateIntroEvents(uint32 diff) { events.Update(diff); - if (!UpdateVictim()) + while (uint32 eventId = events.ExecuteEvent()) { - while (uint32 eventId = events.ExecuteEvent()) + switch (eventId) { - 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; - } + 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; } + } + } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + { + 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; } }; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp index e9f35b087fb..55665ca7582 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kormok.cpp @@ -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; }; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp index bd678b8e71a..f44e64c7e1d 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp @@ -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; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp index 4accabc4746..defb87a86ce 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp @@ -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); + events.Repeat(10s, 20s); break; - case EVENT_DARK_PLAGUE: - DoCastVictim(SPELL_DARK_PLAGUE); - events.Repeat(8s); + case EVENT_NOXIOUS_CATALYST: + DoCastVictim(SPELL_NOXIOUS_CATALYST); + events.Repeat(20s, 30s); break; case EVENT_CORROSIVE_ACID: DoCastSelf(SPELL_CORROSIVE_ACID); - events.Repeat(25s); - break; - case EVENT_NOXIOUS_CATALYST: - DoCastVictim(SPELL_NOXIOUS_CATALYST); - events.Repeat(38s); + events.Repeat(30s, 40s); break; default: break; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp index 8581e5f66aa..3656e4e5e52 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp @@ -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_KNOCK_AWAY: + DoCastSelf(SPELL_KNOCK_AWAY); + _events.Repeat(20s, 30s); break; - case EVENT_FROSTVOLLEY: - DoCastVictim(SPELL_FROSTBOLT_VOLLEY); - _events.Repeat(15s); + case EVENT_FROSTBOLT_VOLLEY: + DoCastSelf(SPELL_FROSTBOLT_VOLLEY); + _events.Repeat(10s, 20s); break; default: break; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_the_ravenian.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_the_ravenian.cpp index 5965e8bf9d3..081cfe52a98 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_the_ravenian.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_the_ravenian.cpp @@ -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; diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp index 768e96b3c8a..422e0963d66 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_vectus.cpp @@ -15,28 +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 VectusTexts -{ - EMOTE_FRENZY = 0 -}; - 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(); - } - void JustEngagedWith(Unit* /*who*/) override - { - _events.ScheduleEvent(EVENT_FIRE_SHIELD, 2s); - _events.ScheduleEvent(EVENT_BLAST_WAVE, 14s); + DoCastSelf(SPELL_FIRE_SHIELD); } - void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override + void JustEngagedWith(Unit* /*who*/) 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; |
